Свойства (C++/CX)
среда выполнения Windows типы предоставляют общедоступные данные в качестве свойств. Клиентский код обращается к свойству как открытым данным-членам. Внутренне свойство реализуется в виде блока, содержащего метод доступа get или set, или оба эти метода. С помощью методов доступа можно выполнять дополнительные действия до или после получения значения; например, можно вызывать события или выполнять проверки.
Замечания
Значение свойства содержится в закрытой переменной (называемой резервным хранилищем), принадлежащей к тому же типу, что и само свойство. Свойство может одновременно содержать метод доступа set, присваивающий значение резервному хранилищу, и метод доступа get, извлекающий значение резервного хранилища. Свойство доступно только для чтения, если оно предоставляет только метод доступа get, только для записи, если предоставляет только метод доступа set, и для чтения и записи, если предоставляет оба метода доступа.
Тривиальное свойство — это свойство, доступное для чтения и записи, для которого компилятор автоматически реализует методы доступа и резервное хранилище. Доступ к реализации компилятора для вас невозможен. Впрочем, вы можете объявить пользовательское свойство и явно объявить его методы доступа и резервное хранилище. Внутри метода доступа можно реализовать любую необходимую логику, например проверку входных данных метода доступа set, вычисление значения с использованием значения свойства или вызов события при изменении свойства.
Когда создается экземпляр класса ссылки C++/CX, его память перед вызовом конструктора инициализируется нулями, таким образом, всем свойствам в качестве значения по умолчанию назначается ноль или nullptr.
Примеры
В следующем примере кода показано, как объявить свойство и обратиться к нему. Первое свойство Name
является тривиальным , поскольку компилятор автоматически создает метод доступа set
, метод доступа get
и резервное хранилище.
Второе свойство Doctor
доступно только для чтения, поскольку для него указан блок property , в котором явно объявлен только метод доступа get
. Поскольку блок property объявлен, необходимо явно объявить резервное хранилище, то есть закрытую переменную doctor_
класса String^. Обычно свойство, доступное только для чтения, просто возвращает значение резервного хранилища. Только сам класс может задавать значение резервного хранилища, обычно это происходит в конструкторе.
Третье свойство Quantity
доступно для чтения и записи, так как в нем объявлен блок property, где объявлены оба метода доступа set
и get
.
Метод доступа set
выполняет определенную пользователем проверку допустимости присваиваемого значения. В отличие от C#, здесь имя value — это просто идентификатор параметра в методе доступа set
, оно не является ключевым словом. Если value не больше нуля, вызывается исключение Platform::InvalidArgumentException. В противном случае резервному хранилищу quantity_
задается присваиваемое значение.
Обратите внимание, что свойство невозможно инициализировать в списке членов. Хотя переменные резервного хранилища можно инициализировать в списке членов.
public ref class Prescription sealed
{
private:
Platform::String^ m_doctor;
int quantity;
public:
Prescription(Platform::String^ name, Platform::String^ d) : m_doctor(d)
{
// Trivial properties can't be initialized in member list.
Name = name;
}
// Trivial property
property Platform::String^ Name;
// Read-only property
property Platform::String^ Doctor
{
Platform::String^ get() { return m_doctor; }
}
// Read-write property
property int Quantity
{
int get() { return quantity; }
void set(int value)
{
if (value <= 0)
{
throw ref new Platform::InvalidArgumentException();
}
quantity = value;
}
}
};
public ref class PropertyConsumer sealed
{
private:
void GetPrescriptions()
{
Prescription^ p = ref new Prescription("Louis", "Dr. Who");
p->Quantity = 5;
Platform::String^ s = p->Doctor;
int32 i = p->Quantity;
Prescription p2("JR", "Dr. Dat");
p2.Quantity = 10;
}
};
См. также
Система типов
Справочник по языку C++/CX
Справочник по пространствам имен