Поиск

Определение и использование свойств

Методы-аксессоры используются программистами на нескольких объектно-ориентированных языках, в том числе на C++ и Java. Однако С# предоставляет еще более мощный механизм — свойства с такими же возможностями, как методы-аксессоры, но гораздо более элегантные на стороне клиента. Свойства позволяют написать клиент, способный обращаться к полям класса, как если бы они были открытыми, даже не зная, существуют ли методы-аксессоры.

Свойство в С# состоит из объявления поля и методов-аксессоров, применяемых для изменения значения поля. Эти методы-аксессоры называются получатель (getter) и установщик (setter). Методы-получатели используются для получения значения поля, а установщики — для его изменения. Вот наш пример, переписанный с применением свойств С#:

class Address {
protected string city;
protected string ZipCode;
public string ZipCode {
get <
return zipCode; }
set {
// Сверить почтовый индекс с базой данных. zipCode = value;
// обновить город с помощью проверенного zipfied*. ^ } } }

Я создал поле Address.zipCode и свойство Address.ZipCode. Поначалу это может ввести в заблуждение: можно подумать, что Address.ZipCode — это поле, да еще и определенное дважды. Но это не поле, а свойство, представляющее собой универсальное средство определения аксессоров для членов класса, что позволяет использовать более интуитивно понятный синтаксис вида объект, поле. Если бы я опустил в этом примере поле Address.zipCode и изменил бы оператор в установщике с zipCode = value на ZipCode = value, метод-установщик вызывался бы в итоге бесконечно. Заметьте также, что установщик не принимает аргументов. Передаваемое значение автоматически помещается в переменную value, доступную внутри метода-установщика (вскоре с помощью MSIL вы увидите, как происходит это маленькое чудо).

А теперь, написав свойство Address.ZipCode, рассмотрим изменения, которые необходимо сделать для клиентского кода:

Address addr = new AddressO;
addr.ZipCode = "55555";
string zip = addr.ZipCode;

Как видите, способ обращения клиента к полям интуитивно понятен: не требуется больше никаких догадок или поисков в документации (и в исходном коде), чтобы узнать, является ли это поле открытым, и, если нет, — выяснять имя метода-аксессора.