属性 (C++/CX)

Windows 运行时类型公开公共数据作为属性。 客户端代码像公共数据成员一样访问该属性。 在内部,该属性实现为包含一个 get 访问器方法、一个 set 访问器方法或二者的块。 通过使用访问器方法,你可以在检索值的前后执行其他操作,例如,可以触发事件或执行验证检查。

备注

属性值包含在私有变量(也称 “后备存储”)中,它与该属性的类型相同。 一个属性可以同时包含 set 访问器(将值赋给后备存储)和 get 访问器(检索后备存储的值)。 如果只提供 get 访问器,则属性是只读的,如果只提供 set 访问器,则属性是只写的,如果两种访问器都提供,则属性是可读写的(可修改)。

trivial 属性是读/写属性,编译器自动为其实现访问器和后备存储。 你无法访问编译器的实现。 但是,你可以声明一个自定义属性并显式声明其访问器和后备存储。 在访问器中,可以执行所需的任何逻辑,如验证对 set 访问器的输入、根据属性值计算值、访问数据库或在属性变化时触发事件。

实例化 C++/CX ref 类后,在调用其构造函数之前将使用零实例化其内存;因此,在声明时将为所有属性分配默认值零或 nullptr。

示例

下面的代码示例演示如何声明和访问属性。 第一个属性 Name称为“trivial” 属性,因为编译器自动生成 set 访问器、 get 访问器和一个后备存储。

第二个属性 Doctor是只读属性,因为它指定只显式声明 访问器的 属性块 get 。 因为声明了属性块,所以必须显式声明一个后备存储,即私有 String^ 变量 doctor_。 通常,只读属性只返回后备存储的值。 只有该类自身可以设置后备存储的值,通常是在构造函数中。

第三个属性 Quantity是一个读/写属性,因为它声明一个同时声明 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 语言参考
命名空间参考