property (Komponentenerweiterungen für C++)
Deklariert eine Eigenschaft, die eine Memberfunktion ist und deren Verhalten und für die der Zugriff sich wie bei einem Datenmember oder einem Arrayelement verhalten.
Alle Laufzeiten
Sie können einen der folgenden Typen von Eigenschaften deklarieren.
Einfache Eigenschaft.
Erstellt standardmäßig einen set-Accessor, der den Eigenschaftswert zuweist, einen get-Accessor, der den Eigenschaftswert abruft, und einen vom Compiler generierten privaten Datenmember, der den Eigenschaftswert enthält.Eigenschaftsblock
Verwenden Sie diese Eigenschaft, um benutzerdefinierte get- bzw. set-Accessoren zu erstellen. Die Eigenschaft ist lese- und schreibgeschützt, wenn der get- und der set-Accessor definiert sind, nur schreibgeschützt, wenn nur der get-Accessor definiert ist, und lesegeschützt, wenn nur der set-Accessor definiert ist.Sie müssen einen Datenmember explizit deklarieren, der den Eigenschaftswert enthalten soll.
Indizierte Eigenschaft
Ein Eigenschaftsblock, mit dem Sie einen Eigenschaftswert abrufen und festlegen können, der durch einen oder mehrere Indizes angegeben wird.Sie können eine indizierte Eigenschaft erstellen, die entweder einen benutzerdefinierten Eigenschaftennamen oder einen Standardeigenschaftsnamen hat. Der Name einer standardmäßigen Indexeigenschaft ist der Name der Klasse, in der die Eigenschaft definiert ist. Um eine Standardeigenschaft zu deklarieren, geben Sie das default-Schlüsselwort anstelle eines Eigenschaftennamens an.
Sie müssen einen Datenmember explizit deklarieren, der den Eigenschaftswert enthalten soll. Für eine indizierte Eigenschaft ist der Datenmember in der Regel ein Array oder eine Auflistung.
Syntax
property type property_name;
property type property_name {
access-modifier type get() inheritance-modifier {property_body};
access-modifier void set(type value) inheritance-modifier {property_body};
}
property type property_name[index_list] {
access-modifier type get(index_list) inheritance-modifier {property_body};
access-modifier void set(index_list, value) inheritance-modifier {property_body};
}
property type default[index_list] {
access-modifier type get(index_list) inheritance-modifier {property_body};
access-modifier void set(index_list, value) inheritance-modifier {property_body};
}
Parameter
type
Der Datentyp des Eigenschaftswerts und folglich die Eigenschaft selbst.property_name
Der Name der Eigenschaft.access-modifier
Ein Zugriffsqualifizierer. Gültige Qualifizierer sind static und virtual.Die get- und set-Accessoren müssen nicht denselben virtual-Qualifizierer haben, sie müssen jedoch beim static-Qualifizierer übereinstimmen.
inheritance-modifier
Ein Vererbungsqualifizierer. Gültige Qualifizierer sind abstract und sealed.index_list
Eine durch Komma getrennte Liste von mindestens einem Index. Jeder Index besteht aus einem Indextyp und einem optionalen Bezeichner, der im Eigenschaftsmethodentext verwendet werden kann.value
Der Wert, der der Eigenschaft in einem set-Vorgang zugewiesen oder in einem get-Vorgang abgerufen werden soll.property_body
Der Text der Eigenschaftsmethode des set- oder get-Accessors. property_body kann index_list verwenden, um auf den zugrunde liegenden Eigenschaftsdatenmember zuzugreifen, oder als Parameter in einer benutzerdefinierten Verarbeitung.
Windows-Runtime
Weitere Informationen finden Sie unter Eigenschaften (C++/CX).
Voraussetzungen
Compileroption: /ZW
Common Language Runtime
Syntax
modifier property type property_name;
modifier property type property_name {
modifier void set(type);
modifier type get();
}
modifier property type property_name[index-list, value] {
modifier void set(index-list, value);
modifier type get(index-list);
modifier property type default[index];
}
Parameter
modifier
Ein Modifizierer, der in einer Eigenschaftendeklaration oder in einer get-/set-Accessormethode verwendet werden kann. Mögliche Werte sind static und virtual.type
Der Typ des Werts, der durch die Eigenschaft dargestellt wird.property_name
Parameter für die Auslöse-Methode, der oder die mit der Signatur des Delegaten übereinstimmen muss/müssen.index_list
Eine durch Komma getrennte Liste mit einem oder mehreren Indizes, die in eckigen Klammern (tiefgestellte Operator, ([])) angegeben sind. Für jeden Index geben Sie einen Typ und optional einen Bezeichner an, die im Eigenschaftsmethodentext verwendet werden können.
Hinweise
Im ersten Syntaxbeispiel wird eine einfache Eigenschaft dargestellt, die implizit eine set- und eine get-Methode deklariert. Der Compiler erstellt automatisch ein privates Feld, um den Wert der Eigenschaft zu speichern.
Im zweiten Syntaxbeispiel wird ein Eigenschaftsblock dargestellt, der explizit eine set- und eine get-Methode deklariert.
Im dritten Syntaxbeispiel wird eine vom Kunden definierte Indexeigenschaft dargestellt. Eine Indexeigenschaft übernimmt Parameter zusätzlich zu dem Wert, der festgelegt oder abgerufen werden muss. Sie müssen einen Namen für die Eigenschaft angeben. Im Unterschied zu einer einfachen Eigenschaft müssen die set- und/oder get-Methoden einer Indexeigenschaft explizit definiert werden, und Sie müssen einen Namen für die Eigenschaft angeben.
Im vierten Syntaxbeispiel wird eine Standardeigenschaft dargestellt, die arrayähnlichen Zugriff auf eine Instanz des Typs bietet. Das Schlüsselwort default dient nur dazu, eine Standardeigenschaft anzugeben. Der Name der standardmäßigen Eigenschaft ist der Name des Typs, in dem die Eigenschaft definiert ist.
Das property-Schlüsselwort kann in einer Klasse, einer Schnittstelle oder einem Werttyp angezeigt werden. Eine Eigenschaft kann über eine get-Funktion (schreibgeschützt), eine set-Funktion (lesegeschützt) oder beide Funktionen (Lese-/Schreibzugriff) verfügen.
Ein Eigenschaftenname darf nicht mit dem Namen der verwalteten Klasse übereinstimmen, in der er enthalten ist. Der Rückgabetyp der Getter-Funktion muss dem Typ des letzten Parameters einer entsprechenden Setter-Funktion entsprechen.
Für Clientcode hat eine Eigenschaft das Aussehen eines gewöhnlichen Datenmembers. Sie können mit derselben Syntax wie bei einem Datenmember in die Eigenschaft schreiben und sie lesen.
Die get-Methode und die set-Methode müssen nicht denselben virtual-Modifizierer haben.
Der Zugriff auf die get-Methode und die set-Methode kann unterschiedlich sein.
Die Definition einer Eigenschaftsmethode kann wie eine normale Methode außerhalb des Klassentexts angezeigt werden.
Die get- und die set-Methode für eine Eigenschaft sollten denselben static-Modifizierer haben.
Eine Eigenschaft ist skalar, wenn die entsprechende get- und set-Methode folgender Beschreibung entspricht:
Die get-Methode hat keine Parameter, und sie hat den Rückgabetyp T.
Die set-Methode verfügt über einen Parameter des Typs T und hat den Rückgabetyp void.
Es sollte nur eine skalare Eigenschaft geben, die in einem Bereich mit dem gleichen Bezeichner deklariert wird. Skalare Eigenschaften dürfen nicht überladen werden.
Wenn ein Eigenschaftsdatenmember deklariert ist, fügt der Compiler einen Datenmember in die Klasse ein. Dieser wird manchmal als "Sicherungsspeicher" bezeichnet. Der Name des Datenmembers muss so formuliert sein, dass Sie nicht so auf den Member in der Quelle nicht verweisen können, als ob er ein tatsächlicher Datenmember der enthaltenen Klasse sei. Verwenden Sie ildasm.exe, um die Metadaten für den Typ anzuzeigen und den vom Compiler generierten Namen für den Sicherungsspeicher der Eigenschaft zu finden.
Für die Accessormethoden sind unterschiedliche Zugriffsmöglichkeiten in einem Eigenschaftsblock zulässig. Das bedeutet, dass die set-Methode öffentlich und die get-Methode privat sein kann. Es ist jedoch ein Fehler, wenn die Accessormethode weniger restriktiven Zugriff hat als in der Deklaration der Eigenschaft selbst vermerkt ist.
property ist ein kontextbezogenes Schlüsselwort. Weitere Informationen finden Sie unter Kontextbezogene Schlüsselwörter (Komponentenerweiterungen für C++).
Weitere Informationen zu Eigenschaften finden Sie unter
Voraussetzungen
Compileroption: /clr
Beispiele
Im folgenden Beispiel wird die Deklaration und Verwendung eines Eigenschaftsdatenmember und eines Eigenschaftsblock dargestellt. Darüber hinaus wird gezeigt, dass ein Eigenschaftsaccessor aus einer Klasse heraus definiert werden kann.
// mcppv2_property.cpp
// compile with: /clr
using namespace System;
public ref class C {
int MyInt;
public:
// property data member
property String ^ Simple_Property;
// property block
property int Property_Block {
int get();
void set(int value) {
MyInt = value;
}
}
};
int C::Property_Block::get() {
return MyInt;
}
int main() {
C ^ MyC = gcnew C();
MyC->Simple_Property = "test";
Console::WriteLine(MyC->Simple_Property);
MyC->Property_Block = 21;
Console::WriteLine(MyC->Property_Block);
}
Ausgabe