Свойства
Ключевое слово _property (свойство) используется для указания на то, что метод получения и/или установки реализует свойство управляемого класса. В отличие от элемента данных (называемого также полем), который однообразен и негибок, свойство может быть доступно для чтения и записи, либо только для чтения и только для записи, может быть реализовано как обычная переменная или как вычисляемое значение. Например, свойство только для чтения должно быть реализовано методом get_, но не методом set_.
Свойство доступно другим программам, написанным на любых языках .NET, посредством использования обычного синтаксиса доступа к элементам данных этого языка, как если бы свойство было обычным элементом данных (точнее псевдоэлементом данных). Это продемонстрировано в следующем фрагменте кода, в котором pmcwp › someProperty используется так, как если бы оно было элементом данных с именем someProperty. Фактически такого элемента данных не существует, но то, что класс содержит методы get_someProperty и set_someProperty, объявленные с ключевым словом _property (свойство), делает возможным такой способ доступа.
В действительности класс содержит защищенный (protected) элемент данных m_someProperty, но это уже подробности реализации, инкапсулированные в компоненте. Свойство компонента в .NET похоже на свойства OLE-автоматизации в компонентах ActiveX или свойства компонентов (bean) в JavaBean.
Другой интересной чертой управляемых свойств, отсутствующей у элементов данных, является то, что вы можете проверить приемлемость аргумента метода set_ и, в случае, если значение аргумента некорректно, вызвать исключение. Это помогает в создании корректно работающих компонентов.
//PropertyExample.срр #using <mscorlib.dll> using namespace System; // использовать пространство имен Система; _gc class ManagedClassWithProperty // класс сборщика мусора ManagedClassWithProperty { public: ManagedClassWithProperty(): m_someProperty(0) {} _property int get_someProperty() // свойство – // должно быть "get_" { return m_someProperty; } _property void set_someProperty(// свойство int propertyValue) // должно быть "set__" { m_someProperty = propertyValue; } protected: // защищенный int m_someProperty; // можно реализовать как элемент данных }; void main() { ManagedClassWithProperty* pmcwp = new ManagedClassWithProperty; pmcwp › someProperty = 7; // псевдоэлемент данных Console::WriteLine(pmcwp › someProperty); }
Вышеприведенная программа выведет:
7