Шаг 122.
Язык программирования C#. Начала
Свойства и индексаторы. Использование свойств

    На этом шаге мы рассмотрим пример, в котором используются оба аксессора.

    Начиная с этого шага мы проанализируем несколько примеров, содержащих классы, в которых описываются и используются свойства. Сначала рассмотрим пример, представленный ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr122_1
{
    // Класс со свойством: 
    class MyClass {
        // Закрытые целочисленные поля: 
        private int first; 
        private int last;
        // Конструктор с двумя аргументами:
        public MyClass(int a, int b) {
            first = a;  // Значение первого поля
            last = b;   // Значение второго поля
        }
        // Переопределение метода ToString(): 
        public override string ToString() {
            // Формирование текстового значения: 
            string txt = "Поля объекта: ";
            txt += first + " и " + last;
            // Результат метода: 
            return txt;
        }
        // Целочисленное свойство: 
        public int number {
            // Метод вызывается при считывании значения свойства: 
            get {
                // Запоминается значение второго поля: 
                int t = last;
                // Новое значение второго поля: 
                last = first;
                // Новое значение первого поля: 
                first = t;
                // Значение свойства: 
                return t;
            }
            // Метод вызывается при присваивании
            // значения свойству:
            set {
                // Новое значение второго поля: 
                last = first;
                // Присваивание значения первому полю: 
                first = value;
            }
        }
    }

    // Класс с главным методом:
    class Program
    {
        // Главный метод:
        static void Main()
        {
            // Создание объекта:
            MyClass obj = new MyClass(1, 9);
            // Проверка значений полей объекта:
            Console.WriteLine(obj);
            // Проверка значения свойства:
            Console.WriteLine("Свойство number: {0}", obj.number); 
            // Проверка значений полей объекта:
            Console.WriteLine(obj);
            // Присваивание значения свойству: 
            obj.number = 5;
            // Проверка значений полей объекта:
            Console.WriteLine(obj);
            // Проверка значения свойства:
            Console.WriteLine("Свойство number: {0}", obj.number); 
            // Проверка значений полей объекта:
            Console.WriteLine(obj);
            // Прозерка значения свойства:
            Console.WriteLine("Свойство number: {0}", obj.number); 
            // Проверка значений полей объекта:
            Console.WriteLine(obj);
            // Присваивание значения свойству: 
            obj.number = 3;
            // Проверка значений полей объекта:
            Console.WriteLine(obj);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Ниже представлен результат данной программы.


Рис.1. Результат выполнения программы

    В программе описан класс MyClass с двумя закрытыми полями целочисленного типа first и last, конструктором с двумя аргументами и свойством number. При вызове конструктора аргументы, переданные ему, присваиваются значениями полям объекта. Свойство number реализовано таким образом, что мы можем и прочитать значение свойства, и присвоить значение свойству. Но последовательность операций, которые выполняются при считывании значения свойства и при присваивании значения свойству, не самая тривиальная. А именно, если мы считываем значение свойства number, то значением возвращается текущее значение поля last, но при этом свойства first и last меняются значениями. Если мы присваиваем значение свойству number, то присваиваемое значение записывается в поле first, а текущее значение поля first присваивается полю last.

    В главном методе программы командой

  MyClass obj = new MyClass(1, 9);
создается объект obj, поля first и last которого получают значения 1 и 9 соответственно. Проверка с помощью команды
  Console.WriteLine(obj);
подтверждает это.
В классе MyClass переопределен метод ToString(), который результатом возвращает текстовую строку со значениями полей first и last объекта. Также напомним, что идентификатор string является псевдонимом для выражения System.String.

    При проверке значения свойства number (инструкция obj.number) значение свойства равно 9, а поля first и last обмениваются значениями (новые значения 9 и 1).

    При присваивании значения 5 свойству number командой

  obj.number = 5;    ,
поле first получает значение 5, а значение 9 присваивается полю last. Проверка свойства number дает 9, а значения полей объекта станут равны 9 и 5 (при проверке значения свойства поля обмениваются значениями). Если мы еще раз проверим свойство number, его значение будет равно 5, а значения полей станут равны 5 и 9. Далее выполняется команда
  obj.number = 3;    ,
вследствие выполнения которой поля получают значения 3 и 5 (поле first получает значение 3, а "старое" значение 5 поля first присваивается значением полю last).

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг