proprietà (Estensioni del componente C++)
Dichiara una proprietà, ovvero una funzione membro che si comporta e viene acceduta come un membro dati o come un elemento di una matrice.
Tutti i runtime
È possibile dichiarare uno dei seguenti tipi di proprietà.
proprietà semplice
Per impostazione predefinita, viene creata una funzione di accesso set che assegna il valore della proprietà, una funzione di accesso get che recupera il valore della proprietà e un membro dati privato generato dal compilatore che contiene il valore della proprietà.blocco di proprietà
Si può utilizzare per creare funzioni di accesso get e/o set definite dall'utente. La proprietà è di lettura/scrittura se entrambe le funzioni di accesso get e set sono state definite, è di sola lettura se solo la funzione di accesso get è stata definita ed è di sola scrittura se solo la funzione di accesso set è stata definita.È necessario dichiarare in modo esplicito un membro dati per contenere il valore della proprietà.
proprietà indicizzata
Un blocco di proprietà che si può utilizzare per ottenere e impostare il valore della proprietà specificato da uno o più indici.È possibile creare una proprietà indicizzata con un nome di una proprietà definita dall'utente o con un nome di una proprietà predefinita. Il nome di una proprietà indicizzata predefinita è il nome della classe in cui è definita la proprietà. Per dichiarare una proprietà predefinita, specificare la parola chiave default anziché un nome di proprietà.
È necessario dichiarare in modo esplicito un membro dati per contenere il valore della proprietà. Per una proprietà indicizzata, il membro dati è in genere una matrice o una raccolta.
Sintassi
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};
}
Parametri
type
Il tipo di dati del valore della proprietà e di conseguenza della proprietà stessa.property_name
Nome della proprietà.access-modifier
Un qualificatore di accesso. I qualificatori validi sono static e virtual.Le funzioni di accesso get o set non devono essere concordi rispetto al qualificatore virtual, ma si devono concordare rispetto al qualificatore static.
inheritance-modifier
Un qualificatore di ereditarietà. I qualificatori validi sono abstract e sealed.index_list
Un elenco delimitato da virgole di uno o più indici. Ogni indice è costituito da un tipo di indice e da un identificatore facoltativo che può essere utilizzato nel corpo del metodo della proprietà.value
Il valore da assegnare alla proprietà in un'operazione set, o da recuperare in un'operazione get.property_body
Il corpo del metodo della proprietà per la funzione di accesso set o get. Il parametro property_body può utilizzare index_list per accedere al membro dati sottostante della proprietà oppure come parametro nell'elaborazione definita dall'utente.
Windows Runtime
Per ulteriori informazioni, vedere Proprietà (C++/CX).
Requisiti
Opzione del compilatore: /ZW
Common Language Runtime
Sintassi
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];
}
Parametri
modifier
Un modificatore che può essere utilizzato in una dichiarazione di proprietà o in un metodo della funzione di accesso get/set. I valori possibili sono static e virtual.type
Il tipo del valore rappresentato dalla proprietà.property_name
Parametro(i) per il metodo raise; deve corrispondere alla firma del delegato.index_list
Un elenco delimitato da virgole di uno o più indici, specificato tra parentesi quadre (l'operatore di indice, ([])). Per ogni indice, specificare un tipo e facoltativamente un identificatore che possa essere utilizzato nel corpo del metodo della proprietà.
Osservazioni
Il primo esempio di sintassi mostra una proprietà semplice, che dichiara in modo implicito entrambi i metodi set e get. Il compilatore crea automaticamente un campo privato per archiviare il valore della proprietà.
Il secondo esempio di sintassi mostra un blocco di proprietà, che dichiara in modo esplicito entrambi i metodi set e get.
Il terzo esempio di sintassi illustra una proprietà indicizzata definita dal cliente. Una proprietà indicizzata accetta altri parametri oltre al valore da impostare o da recuperare. È necessario specificare un nome per la proprietà. A differenza di una proprietà semplice, i metodi get e/o set di una proprietà indicizzata devono essere definiti in modo esplicito e occorre specificare un nome per la proprietà.
Il quarto esempio di sintassi illustra una proprietà predefinita, che fornisce un accesso di tipo matrice ad un'istanza del tipo. La parola chiave, default, serve solo per specificare una proprietà predefinita. Il nome di una proprietà predefinita è il nome del tipo in cui è definita la proprietà.
La parola chiave property può trovarsi in una classe, in una interfaccia o in un tipo di valore. Una proprietà può avere una funzione get (sola lettura), una funzione set (sola scrittura) o entrambe (lettura e scrittura).
Un nome di proprietà non deve corrispondere al nome della classe gestita che la contiene. Il tipo restituito dalla funzione Get deve corrispondere al tipo dell'ultimo parametro di una funzione Set corrispondente.
Nell'ambito del codice client, una proprietà ha l'aspetto di un membro dati ordinario e può essere scritta o letta utilizzando la stessa sintassi di un membro dati.
I metodi get e set non devono concordarsi rispetto al modificatore virtual.
L'accessibilità dei metodi get e set può differire.
La definizione di un metodo della proprietà può apparire all'esterno del corpo della classe, come un metodo comune.
I metodi set e get per una proprietà devono essere concordi rispetto al modificatore static.
Una proprietà è scalare se i relativi metodi get e set corrispondono alla seguente descrizione:
Il metodo get non dispone di parametri e il tipo restituito è T.
Il metodo set ha un parametro di tipo T e ha tipo restituito void.
Ci può essere solo una proprietà scalare dichiarata in un ambito con lo stesso identificatore. Le proprietà scalari non possono essere sottoposte a overload.
Quando un membro dati della proprietà viene dichiarato, il compilatore inserisce un membro dati — talvolta denominato "archivio di backup" — nella classe. Tuttavia, il nome del membro dati è di forma tale che non è possibile fare riferimento al membro nell'origine come se fosse un membro dati effettivo della classe che lo contiene. Utilizzare ildasm.exe per visualizzare i metadati per il tipo e per visualizzare il nome generato dal compilatore per l'archivio di backup della proprietà.
Per i metodi della funzione di accesso in un blocco di proprietà sono consentiti diversi tipi di accessibilità. Ciò significa che il metodo set può essere pubblico e il metodo get può essere privato. Tuttavia, è un errore per un metodo di accesso disporre di un'accessibilità meno restrittiva rispetto a quella della dichiarazione della proprietà stessa.
property è una parola chiave sensibile al contesto. Per ulteriori informazioni, vedere Parole chiave sensibili al contesto (Estensioni del componente C++).
Per ulteriori informazioni sulle proprietà, vedere
Requisiti
Opzione del compilatore: /clr
Esempi
Nell'esempio seguente vengono illustrati la dichiarazione e l'utilizzo di un membro dati della proprietà e di un blocco di proprietà. Viene inoltre mostrato che una funzione di accesso ad una proprietà può essere definita all'esterno della classe.
// 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);
}
Output