Declaración de índices de propiedad
Actualización: noviembre 2007
La sintaxis para declarar una propiedad indizada ha cambiado de Extensiones administradas para C++ a Visual C++ 2008.
Los dos inconvenientes principales de la compatibilidad del lenguaje de Extensiones administradas con las propiedades indizadas es la incapacidad de proporcionar suscripción en el nivel de clase; es decir, se tiene que asignar nombre a todas las propiedades indizadas, y por ello no hay modo, por ejemplo, de facilitar un operador de subscripción administrado que se pueda aplicar directamente a un objeto de clase Vector o Matrix. Un segundo inconveniente importante es que es difícil distinguir visualmente una propiedad de una propiedad indizada, el número de parámetros es la única indicación. Finalmente, las propiedades indizadas sufren los mismos problemas que las propiedades no indizadas, los descriptores de acceso no se tratan como una unidad atómica, sino de forma independiente como métodos individuales. Por ejemplo:
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 );
};
Como puede ver aquí, los indizadores sólo se distinguen por los parámetros adicionales para especificar un índice de una o dos dimensiones. En la nueva sintaxis, los indizadores se distinguen por los corchetes ([,]) seguidos del nombre del indizador e indicando el número y el tipo de cada índice:
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 );
}
};
Para indicar un indizador en el nivel de clase que se puede aplicar directamente a objetos de la clase en la nueva sintaxis, la palabra clave default se reutiliza para sustituir a un nombre explícito. Por ejemplo:
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 );
}
};
En la nueva sintaxis, cuando se especifica la propiedad indizada predeterminada, se reservan los dos nombres siguientes: get_Item y set_Item. Esto se debe a que éstos son los nombres subyacentes generados para la propiedad indizada predeterminada.
Observe que no hay ninguna sintaxis de índice simple análoga a la sintaxis de propiedad simple.