На этом шаге мы рассмотрим пример использования нескольких свойств в одном классе.
Еще одна программа, иллюстрирующая использование сразу нескольких свойств в одном классе, представлена в листинге 9.5.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr125_1 { // Класс со свойствами: class MyClass { // Закрытое поле-массив: private int[] nums; // Текстовое свойство без set-аксессора: public string content { // Метод вызывается при считывании значения свойства: get { // Если ссыпка на массив пустая: if( nums == null ) return "{}"; // Формирование текстовой строки: string txt = "{" + nums[0]; for(int k = 1; k < nums.Length; k++) { txt += "," + nums[k]; } txt += "}"; // Значение свойства: return txt; } } // Целочисленное свойство без get-аксессора: public int element { // Метод вызывается при присваивании // значения свойству: set { // Если ссылка на массив пустая: if( nums == null ) { // Создание массива из одного элемента: nums = new int[1]; // Значение единственного элемента массива: nums[0] = value; } else { // Если ссылка не пустая // Создание массива: int[] n = new int[nums.Length + 1]; // Заполнение массива: for(int k = 0; k < nums.Length; k++){ n[k] = nums[k]; } // Значение последнего элемента в массиве: n[nums.Length] = value; // Ссылка на созданный массив записывается в // поле объекта: nums = n; } } } // Свойство является ссылкой на массив: public int[] data { // Метод вызывается при считывании значения свойства: get { // Создание массива: int[] res = new int[nums.Length]; // Заполнение массива: for(int k = 0; k < nums.Length; k++) { res[k] = nums[k]; } // Значение свойства: return res; } // Метод вызывается при присваивании // значения свойству: set { // Создание массива: nums = new int[value.Length]; // Заполнение массива: for (int k = 0; k < value.Length; k++){ nums[k] = value[k]; } } } } // Класс с главным методом: class Program { // Главный метод: static void Main() { // Создание объекта: MyClass obj = new MyClass(); // Проверка содержимого массива из объекта: Console.WriteLine(obj.content); // Присваивание значения свойству element: obj.element = 10; // Проверка содержимого массива из объекта: Console.WriteLine(obj.content); // Присваивание значения свойству element: obj.element = 5; obj.element = 7; // Проверка содержимого массива из объекта: Console.WriteLine(obj.content); // Считывание значения свойства data: int[] A = obj.data; // Присваивание значения свойству element: obj.element = 12; // Отображение содержимого массива А: for(int k = 0; k < A.Length; k++) { Console.Write(A[k] + " "); } Console.WriteLine(); // Проверка содержимого массива из объекта: Console.WriteLine(obj.content); // Создание массива: int[] B = {11, 3, 6}; // Присваивание значения свойству data: obj.data = B; // Изменение значения элемента массива В: B[0] = 0; // Отображение содержимого массива В: for(int k = 0; k < B.Length; k++){ Console.Write(B[k] + " "); } Console.WriteLine(); // Проверка содержимого массива из объекта: Console.WriteLine(obj.content); // Задержка: Console.ReadLine(); } } }
В результате выполнения программы получаем следующее.
Рис.1. Результат выполнения программы
Класс MyClass имеет закрытое поле nums, представляющее собой ссылку на целочисленный массив. Этот массив используется при описании свойств content, element и data. Свойство content текстовое, и у этого свойства есть только get-аксессор (свойство можно прочитать, но нельзя присвоить). Свойство возвращает текстовую строку со значениями элементов массива. При вызове get-аксессора для этого свойства в условной конструкции проверяется условие nums==null, истинное, если поле nums не ссылается на массив. Если так, то значением свойства возвращается строка "{}".
Если же поле nums ссылается на массив, то формируется текстовая прока, содержащая значения элементов массива, и эта строка возвращается как значение свойства content.
Целочисленное свойство element не имеет get-аксессора, поэтому свойству можно присвоить значение, но нельзя узнать значение свойства. При присваивании значения свойству в массив nums добавляется новый элемент с присваиваемым значением. Для этого в теле set-аксессора в условной конструкции проверяется условие nums==null. Истинность условия означает, что поле nums на массив не ссылается. В таком случае командой
nums = new int[1];
nums[0] = value; .
Если условие nums==null в условной конструкции ложно, то командой
int[] n = new int[nums.Length + 1];
n[nums.Length] = value;
nums = n;
Свойство data является ссылкой на целочисленный массив. Для свойства описаны два аксессора. Это означает, что свойству значением можно присвоить ссылку на массив и результатом свойства является также ссылка на массив.
В get-аксессоре для этого свойства командой
int[] res = new int[nums.Length];
В set-аксессоре для свойства data командой
nums = new int[value.Length];
В главном методе программы командой
MyClass obj = new MyClass();
Console.WriteLine(obj.content);
obj.element = 10;
obj.element = 5;
obj.element = 7;
На следующем этапе командой
int[] A = obj.data;
obj.element = 12;
Далее командой
int[] B = {11, 3, 6};
obj.data = B;
B[0] = 0;
B[0] = 0; .
На следующем шаге мы рассмотрим закончим изучение этого вопроса.