Condividi tramite


__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);
}