__box
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 Boxing (Estensioni del componente C++).
Viene creata una copia gestita di un oggetto di classe __value.
__box(value-class identifier)
Note
La parola chiave __box viene utilizzata per creare un oggetto gestito (derivato da System::ValueType) da un oggetto di classe __value esistente. Quando la parola chiave __box viene applicata a una classe __value:
Un oggetto gestito viene allocato nell'heap di Common Language Runtime.
Il valore corrente dell'oggetto di classe __value viene copiato bit per bit nell'oggetto gestito.
Viene restituito l'indirizzo del nuovo oggetto gestito.
Questo processo è noto come conversione boxing. Ciò consente di utilizzare qualsiasi oggetto di classe __value nelle routine generiche adatte a tutti gli oggetti gestiti, perché l'oggetto gestito eredita indirettamente da System::Object, dato che System::ValueType eredita da System::Object.
Nota
L'oggetto boxed appena creato è una copia dell'oggetto di classe __value.Di conseguenza, le modifiche al valore dell'oggetto boxed non influiscono sul contenuto dell'oggetto di classe __value.
Esempio
Nell'esempio seguente vengono eseguite le conversioni boxing e unboxing:
// keyword__box.cpp
// compile with: /clr:oldSyntax
#using < mscorlib.dll >
using namespace System;
int main() {
Int32 i = 1;
System::Object* obj = __box(i);
Int32 j = *dynamic_cast<__box Int32*>(obj);
}
Nell'esempio seguente, un tipo di valore non gestito (V) viene sottoposto a boxing e passato come parametro gestito alla funzione Positive.
// keyword__box2.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
using namespace System;
__value struct V {
int i;
};
void Positive(Object*) {} // expects a managed class
int main() {
V v={10}; // allocate and initialize
Console::WriteLine(v.i);
// copy to the common language runtime heap
__box V* pBoxedV = __box(v);
Positive(pBoxedV); // treat as a managed class
pBoxedV->i = 20; // update the boxed version
Console::WriteLine(pBoxedV->i);
}