__value
Nota
Questo argomento si applica solo alla versione 1 delle estensioni gestite per C++.Questa sintassi deve essere utilizzata solo per gestire il codice della versione 1.Per informazioni sull'utilizzo della funzionalità equivalente nella nuova sintassi, vedere Classi e struct (Estensioni del componente C++).
Dichiara una classe come un tipo __value.
__value class-specifier
__value struct-specifier
__nogc array-specifier
__nogc pointer-specifier
Note
Un tipo __value differisce dai tipi __gc in quanto le variabili di tipo __value contengono direttamente i dati, mentre le variabili gestite puntano ai dati, archiviati nell'heap di Common Language Runtime.
Le seguenti condizioni si applicano ai tipi __value:
La parola chiave __value non può essere applicata a un'interfaccia.
Un tipo __value può ereditare da un numero qualsiasi di interfacce e non da altri tipi o dai tipi __value.
Un tipo __value è sealed per definizione. Per ulteriori informazioni, vedere __sealed.
È valido utilizzare un tipo __value ogni volta che un tipo gestito è consentito.
Nota
La parola chiave __value non è consentita se utilizzata con la parola chiave __abstract.
Un tipo __value può essere connesso in modo esplicito a un puntatore System::Object. Questo concetto è noto come boxing.
Le linee guida seguenti si applicano per incorporare un tipo di valore in un tipo __nogc:
Il tipo di valore deve disporre di LayoutSequential o LayoutExplicit.
Il tipo di valore non può avere membri puntatore _gc.
Il tipo di valore non può disporre di membri dati privati.
Nelle estensioni gestite di C++ gli equivalenti di una classe e di uno struct C# sono i seguenti:
Estensioni gestite per C++ |
C# |
Per ulteriori informazioni |
---|---|---|
__gc struct -oppure- __gc class |
classe |
Parola chiave class |
__value struct -oppure- __value class |
struct |
parola chiave struct |
Esempio
Nell'esempio seguente un tipo __value (V) viene dichiarato e quindi vengono manipolate due istanze del tipo __value:
// keyword__value.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
__value struct V {
int m_i;
};
int main() {
V v1, v2;
v1.m_i = 5;
v2 = v1; // copies all fields of v1 to v2
v2.m_i = 6; // does not affect v1.m_I
}