プロパティ (C++/CX)
Windows ランタイム型はプロパティとしてパブリック データを公開します。 クライアント コードは、パブリック データ メンバーのようにプロパティにアクセスします。 内部的には、プロパティは get アクセサー メソッドと set アクセサー メソッド、またはその両方を含むブロックとして実装されます。 アクセサー メソッドを使用すると、値を取得する前または後に追加操作を実行できます。たとえば、イベントを発生させたり、検証チェックを実行したりすることができます。
解説
プロパティの値は、 バッキング ストアとして知られるプライベート変数に格納されており、これはプロパティと同じ型です。 プロパティには、バッキング ストアに値を割り当てる set アクセサーと、バッキング ストアの値を取得する get アクセサーの両方を含めることができます。 プロパティは、get アクセサーだけを提供する場合は読み取り専用、set アクセサーだけを提供する場合は書き込み専用で、両方のアクセサーを提供する場合は読み書き可能 (変更可能) です。
trivial プロパティは、コンパイラが自動的にアクセサーとバッキング ストアを実装する読み書き可能プロパティです。 コンパイラの実装にはアクセスできません。 ただし、カスタム プロパティを宣言し、明示的にアクセサーとバッキング ストアを宣言することができます。 アクセサー内部では、set アクセサーへの入力を検証する、プロパティ値から値を計算する、データベースにアクセスする、プロパティが変更されたときにイベントを発生させるなど、必要なロジックを実行できます。
C++/CX ref クラスをインスタンス化する場合、コンストラクターを呼び出す前にメモリがゼロ初期化されます。したがって、宣言時にすべてのプロパティにゼロまたは nullptr という既定値が割り当てられます。
例
次のコード例では、プロパティを宣言してアクセスする方法を示します。 最初のプロパティ Name
は trivial プロパティとして知られています。コンパイラが 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;
}
};