Deklaration von Eigenschaftenindizes
Aktualisiert: November 2007
Die Syntax zum Deklarieren einer indizierten Eigenschaft hat sich in Visual C++ 2008 gegenüber Managed Extensions for C++ geändert.
Ein grundlegendes Defizit der Managed Extensions-Programmiersprachenunterstützung für indizierte Eigenschaften ist die fehlende Unterstützung für eine Indizierung auf Klassenebene. Dies bedeutet, dass für alle indizierten Eigenschaften ein Name erforderlich ist und z. B. keine Möglichkeit besteht, einen verwalteten Indexoperator bereitzustellen, der direkt auf ein Vector-Klassenobjekt oder ein Matrix-Klassenobjekt angewendet werden kann. Ein zweiter, weniger bedeutender Nachteil besteht darin, dass sich eine herkömmliche Eigenschaft visuell nur schwer von einer indizierten Eigenschaft unterscheiden lässt. Der einzige Anhaltspunkt ist die Anzahl der Parameter. Schließlich haben indizierte Eigenschaften die gleichen Schwächen wie nicht indizierte Eigenschaften: Die Accessoren werden nicht als atomare Einheit behandelt, sondern in einzelne Methoden unterteilt. Beispiel:
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 );
};
Beachten Sie, dass sich die Indexer nur durch die zusätzlichen Parameter unterscheiden, welche die Ein- oder Zweidimensionalität eines Index angeben. Nach der neuen Syntax lassen sich die Indexer anhand der Klammern ([,]) hinter dem Indexernamen unterscheiden, die die Nummer und den Typ eines jeden Index angeben:
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 );
}
};
Um in der neuen Syntax einen Indexer auf Klassenebene anzugeben, der direkt auf Objekte der Klasse angewendet werden kann, wird das default-Schlüsselwort erneut verwendet, um damit einen expliziten Namen zu ersetzen. Beispiel:
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 );
}
};
Wenn die indizierte Standardeigenschaft in der neuen Syntax angegeben wird, werden die beiden folgenden Namen reserviert: get_Item und set_Item. Das liegt daran, dass es sich dabei um die zugrunde liegenden, für die indizierte Standardeigenschaft generierten Namen handelt.
Beachten Sie, dass es keine einfache Indexsyntax gibt, die zur einfachen Eigenschaftensyntax analog ist.
Siehe auch
Konzepte
Memberdeklarationen innerhalb einer Klasse oder Schnittstelle