Методы-аксессоры используются программистами на нескольких объектно-ориентированных языках, в том числе на 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;
Как видите, способ обращения клиента к полям интуитивно понятен: не требуется больше никаких догадок или поисков в документации (и в исходном коде), чтобы узнать, является ли это поле открытым, и, если нет, — выяснять имя метода-аксессора.