プロパティ (C++/CX)

Windows ランタイム型はプロパティとしてパブリック データを公開します。 クライアント コードは、パブリック データ メンバーのようにプロパティにアクセスします。 内部的には、プロパティは get アクセサー メソッドと set アクセサー メソッド、またはその両方を含むブロックとして実装されます。 アクセサー メソッドを使用すると、値を取得する前または後に追加操作を実行できます。たとえば、イベントを発生させたり、検証チェックを実行したりすることができます。

解説

プロパティの値は、 バッキング ストアとして知られるプライベート変数に格納されており、これはプロパティと同じ型です。 プロパティには、バッキング ストアに値を割り当てる set アクセサーと、バッキング ストアの値を取得する get アクセサーの両方を含めることができます。 プロパティは、get アクセサーだけを提供する場合は読み取り専用、set アクセサーだけを提供する場合は書き込み専用で、両方のアクセサーを提供する場合は読み書き可能 (変更可能) です。

trivial プロパティは、コンパイラが自動的にアクセサーとバッキング ストアを実装する読み書き可能プロパティです。 コンパイラの実装にはアクセスできません。 ただし、カスタム プロパティを宣言し、明示的にアクセサーとバッキング ストアを宣言することができます。 アクセサー内部では、set アクセサーへの入力を検証する、プロパティ値から値を計算する、データベースにアクセスする、プロパティが変更されたときにイベントを発生させるなど、必要なロジックを実行できます。

C++/CX ref クラスをインスタンス化する場合、コンストラクターを呼び出す前にメモリがゼロ初期化されます。したがって、宣言時にすべてのプロパティにゼロまたは nullptr という既定値が割り当てられます。

次のコード例では、プロパティを宣言してアクセスする方法を示します。 最初のプロパティ Nametrivial プロパティとして知られています。コンパイラが set アクセサー、 get アクセサー、バッキング ストアを自動的に生成するからです。

2 番目のプロパティ Doctorは読み取り専用プロパティです。 アクセサーのみを明示的に宣言する プロパティ ブロック get を指定するからです。 プロパティ ブロックが宣言されるため、バッキング ストア、つまりプライベート String^ 変数 doctor_を明示的に宣言する必要があります。 通常、読み取り専用プロパティはバッキング ストアの値だけを返します。 コンストラクターには通常、クラス自体だけがバッキング ストアの値を設定できます。

3 番目のプロパティ 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 言語リファレンス
名前空間参照