Использование свойств (Руководство по программированию в C#)

Использование свойств (Руководство по программированию в C#)

Свойства сочетают в себе возможности полей и методов. Пользователю объекта свойство представляется как поле, и для доступа к нему применяется тот же синтаксис. При реализации класса свойство представляется в виде одного или двух блоков кода для методов доступа get и (или) set. Блок кода для метода доступа get выполняется только при считывании свойства, а для метода set — при присвоении свойству нового значения. Свойство без метода доступа set доступно только для чтения. Свойство без метода доступа get доступно только для записи. Свойство, для которого определены оба этих метода, доступно для чтения и записи. В C# 9 и более поздних версий можно использовать метод доступа init вместо set , чтобы сделать свойство доступным только для чтения.

В отличие от полей, свойства не классифицируются как переменные. Соответственно, нельзя передать свойство в качестве параметра ref или out.

Свойства нашли широкое применение в программировании. Их можно использовать для проверки данных перед подтверждением изменения; для прозрачного предоставления доступа к данным класса, которые фактически извлекаются из других источников, например из базы данных; для выполнения действия при изменении данных (например, в этом случае может создаваться событие или изменяться значение других полей).

При объявлении свойств в блоке класса указывается уровень доступа поля, затем тип и имя свойства, а после этого блок кода, в котором объявляются методы доступа get и (или) set . Пример:

В этом примере Month объявляется как свойство, а метод доступа set обеспечивает установку значения Month в диапазоне от 1 до 12. Для отслеживания фактического значения свойство Month использует частное поле. Реальное расположение данных свойства часто называется "резервным хранилищем" для свойства. Обычно для свойств используются частные поля в качестве резервного хранилища. Поле помечается как частное для того, чтобы гарантировать возможность его изменения только посредством вызова свойства. Дополнительные сведения об ограничениях открытого и закрытого доступа см. в разделе Модификаторы доступа.

Автоматически реализуемые свойства поддерживают упрощенный синтаксис для простых объявлений свойств. Дополнительные сведения см. в разделе Автоматически реализуемые свойства.

Метод доступа get

Тело метода доступа get похоже на тело метода. Оно должно возвращать значение заданного типа свойства. Выполнение метода доступа get эквивалентно считыванию значения поля. Например, если включена оптимизация и метод доступа get возвращает частную переменную, вызов метода доступа get определяется компилятором как встроенный, что позволяет исключить затраты ресурсов на вызов метода. Тем не менее виртуальный метод доступа get не может определяться как встроенный, поскольку во время компиляции компилятору не известно, как метод может быть фактически вызван во время выполнения. Ниже показан метод доступа get , возвращающий значение частного поля _name :

При ссылке на свойство (кроме случаев, когда свойство является целью присваивания) вызывается метод доступа get , который считывает значение свойства. Пример:

get Метод доступа должен заканчиваться инструкцией get или throw , а Управление не может передаваться из тела метода доступа.

Изменение состояния объекта с помощью метода доступа get считается ошибочным стилем программирования. Например, побочным эффектом следующего метода доступа является изменение состояния объекта каждый раз при доступе к полю _number .

Метод доступа get можно использовать для возврата значения поля напрямую или после вычисления. Пример:

Если в предыдущем фрагменте кода свойству Name не присвоено значение, будет возвращено значение NA .

Метод доступа set

Этот метод доступа напоминает метод, тип возвращаемого значения set которого — set . В нем используется неявный параметр value , тип которого соответствует типу свойства. В следующем примере метод доступа set добавляется к свойству Name :

При присвоении значения свойству вызывается метод доступа set с аргументом, содержащим новое значение. Пример:

Использование имени явного параметра ( value ) для объявления локальной переменной в методе доступа set является ошибкой.

Метод доступа init

Код для создания метода доступа init аналогичен коду для создания метода доступа set , за исключением того, что используется ключевое слово init вместо set . Различие заключается в том, что init метод доступа может использоваться только в конструкторе или с помощью init .

Комментарии

Свойства могут быть помечены как public , private , protected , internal , protected internal или private protected . Эти модификаторы доступа определяют, каким образом пользователи класса смогут получать доступ к свойству. Методы доступа get и set для одного свойства могут иметь разные модификаторы доступа. Например, метод доступа get может иметь модификатор public , разрешающий доступ из-за пределов типа только для чтения, а метод доступа set — модификатор private или protected . Дополнительные сведения см. в статье Модификаторы доступа.

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

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

Свойство, переопределяющее виртуальное свойство, также может быть запечатанным (sealed). Это указывает, что для производных классов оно больше не является виртуальным. Наконец, свойство можно объявить абстрактным (abstract). Это означает, что в классе не будет определена реализация такого свойства, и в производных классах должны использоваться собственные реализации. Дополнительные сведения об этих параметрах см. в разделе Абстрактные и запечатанные классы и члены классов.

Использование модификаторов virtual, abstract или override в методе доступа статического (static) свойства является ошибкой.

Примеры

В этом примере демонстрируются свойства экземпляра, а также статические и доступные только для чтения свойства. Этот метод принимает введенное с клавиатуры имя сотрудника, увеличивает значение NumberOfEmployees на 1, после чего отображает имя и номер сотрудника.

Пример скрытого свойства

В этом примере демонстрируется доступ к свойству базового класса, которое скрыто в производном классе другим свойством с таким же именем:

На что следует обратить внимание в предыдущем примере:

Свойство Name в производном классе скрывает свойство Name базового класса. В таком случае в объявлении свойства в производном классе используется модификатор new :

Для доступа к скрытому свойству в базовом классе используется приведение (Employee) :

Дополнительные сведения о скрытии элементов см. в разделе Модификатор new.

Пример переопределения свойства

В этом примере два класса ( Cube и Square ) реализуют абстрактный класс Shape и переопределяют его абстрактное свойство Area . Обратите внимание на использование модификатора override в свойствах. Программа принимает введенную длину стороны, на основании которой рассчитывает площади квадрата и куба. Также принимается введенное значение площади, на основании которой рассчитываются длины сторон квадрата и куба.

📎📎📎📎📎📎📎📎📎📎