Déclaration de l'index de la propriété
Mise à jour : novembre 2007
La syntaxe servant à déclarer une propriété indexée a été modifiée entre Extensions managées pour C++ et Visual C++ 2008.
La prise en charge par le langage des Extensions managées des propriétés indexées présente deux défauts principaux. Le premier est son incapacité à fournir une mise en indice de niveau de classe ; autrement dit, toutes les propriétés indexées doivent être nommées, et il n'y a donc, par exemple, aucun moyen de fournir un opérateur managé de mise en indice qui puisse être directement appliqué à un objet de classe Vector ou Matrix. Le second défaut, moins problématique, est qu'il est visuellement difficile de distinguer une propriété d'une propriété indexée, le nombre de paramètres étant la seule indication. Enfin, les propriétés indexées souffrent des mêmes problèmes que les propriétés non indexées - les accesseurs ne sont pas traités comme une unité atomique, mais séparés dans des méthodes individuelles. Par exemple :
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 );
};
Comme vous pouvez le constater, les indexeurs ne se distinguent que par les paramètres supplémentaires qui spécifient un index à deux ou à une seule dimension. Dans la nouvelle syntaxe, les indexeurs se distinguent par les crochets ([,]) qui suivent le nom de l'indexeur et qui indiquent le nombre et le type de chaque index :
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 );
}
};
Dans la nouvelle syntaxe, pour indiquer un indexeur de niveau de classe qui peut être appliqué directement aux objets de la classe, le mot clé default est réutilisé pour se substituer à un nom explicite. Par exemple :
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 );
}
};
Dans la nouvelle syntaxe, lorsque la propriété indexée par défaut est spécifiée, les deux noms suivants sont réservés : get_Item et set_Item. En effet, il s'agit des noms sous-jacents générés pour la propriété indexée par défaut.
Notez qu'il n'y a aucune syntaxe d'index simple analogue à la syntaxe de propriété simple.