インデックス付きプロパティの宣言の構文は、Visual C++ 2010 では C++ マネージ拡張から変更されています。
インデックス付きプロパティに対するマネージ拡張言語サポートには大きな欠点が 2 つあります。1 つは、クラス レベルの添字が使用できないため、すべてのインデックス付きプロパティに対して名前を設定する必要があることです。その結果、Vector または Matrix クラス オブジェクトに対して直接適用可能な、マネージされた添字演算子などを利用できなくなります。 もう 1 つの欠点は、重要性という点では劣りますが、プロパティとインデックス付きプロパティとを視覚的には判別が困難になることです。パラメーターの数から判別する以外に術がないからです。 最後に、インデックス付きプロパティにはインデックスで指定されていないプロパティと同様の問題があります。つまり、アクセサーが個々のメソッドと別々に定義されており、一体化されていないということです。 この例を次に示します。
public __gc class Vector;
public __gc class Matrix {
float mat[,];
public:
__property void set_Item( int r, int c, float value);
__property float get_Item( int r, int c );
__property void set_Row( int r, Vector* value );
__property Vector* get_Row( int r );
};
これを見てわかるように、インデクサーは、2 次元または 1 次元インデックスを示す追加パラメーターによって判別されるだけです。 新しい構文では、インデクサー名の後の角かっこ ([、]) によってインデクサーの判別が行われます。角かっこ内のパラメーターは、各インデックスの数と型を表しています。
public ref class Vector {};
public ref class Matrix {
private:
array<float, 2>^ mat;
public:
property float Item [int,int] {
float get( int r, int c );
void set( int r, int c, float value );
}
property Vector^ Row [int] {
Vector^ get( int r );
void set( int r, Vector^ value );
}
};
新しい構文を使用して、クラスのオブジェクトに直接適用可能なクラス レベルのインデクサーを指定するには、明示的な名前の代わりに default キーワードを再使用します。 この例を次に示します。
public ref class Matrix {
private:
array<float, 2>^ mat;
public:
// ok: class level indexer now
//
// Matrix mat …
// mat[ 0, 0 ] = 1;
//
// invokes the set accessor of the default indexer …
property float default [int,int] {
float get( int r, int c );
void set( int r, int c, float value );
}
property Vector^ Row [int] {
Vector^ get( int r );
void set( int r, Vector^ value );
}
};
新しい構文では、既定のインデックス付きプロパティが指定されると、get_Item および set_Item という 2 つの名前が予約されます。 これは、既定のインデックス付きプロパティに対して生成される基本名が存在するためです。
インデックスの場合は、プロパティとは異なり、単純な構文は使用できません。