Ключевое слово _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