Поделиться через


Свойства (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
Справочник по пространствам имен