__box
Dica
Este tópico se aplica somente à versão 1 de Managed Extensions for C++.Esta sintaxe só deve ser usada para manter o código da versão 1.Consulte Boxing implícita para obter informações sobre como usar a funcionalidade equivalente na nova sintaxe.
Cria uma cópia gerenciada de um objeto da classe __value.
__box(value-class identifier)
Comentários
A palavra-chave __box é usada para criar um objeto gerenciado (derivado de System::ValueType) de um objeto existente da classe __value. Quando a palavra-chave __box é aplicada a uma classe __value:
Um objeto gerenciado é alocado no heap de Common Language Runtime.
O valor atual do objeto da classe __value é copiado em termos de bit para o objeto gerenciado.
O endereço do novo objeto gerenciado é retornado.
Esse processo é conhecido como boxing. Isso permite que qualquer objeto da classe __value a ser usado em rotinas genéricas que funcionam para qualquer objeto gerenciado, pois o objeto gerenciado é herdado indiretamente de System::Object (já que System::ValueType é herdado de System::Object).
Dica
O objeto boxed recém-criado é uma cópia do objeto da classe __value.Portanto, as modificações no valor do objeto boxed não afetam o conteúdo do objeto da classe __value.
Exemplo
Veja aqui um exemplo que faz 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);
}
No exemplo a seguir, um tipo de valor não gerenciado (V) é boxed e transmitido como um parâmetro gerenciado à função 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);
}