__box
Publicada: abril de 2016
Nota
Este tema solo es aplicable a la versión 1 de Extensiones administradas para C++. Esta sintaxis solo se debe utilizar para mantener el código de la versión 1. Consulte Conversión boxing (Extensiones de componentes de C++) para obtener información sobre el uso de la funcionalidad equivalente en la nueva sintaxis.
Crea una copia administrada de un objeto de la clase __value.
Sintaxis
__box(
value-class identifier
)
Comentarios
La palabra clave __box se utiliza para crear un objeto administrado (derivado de System::ValueType) a partir de un objeto existente de la clase __value. Cuando la palabra clave __box se aplica a una clase __value:
Un objeto administrado se asignad en el montón de Common Language Runtime.
El valor actual del objeto de la clase __value se copia bit a bit en el objeto administrado.
Se devuelve la dirección del nuevo objeto administrado.
Este proceso se denomina conexión boxing. Esto permite que cualquier objeto de la clase __value se utilice en las rutinas genéricas que funcionan para cualquier objeto administrado porque el objeto administrado hereda indirectamente de System::Object (ya que System::ValueType hereda de System::Object).
Nota
El objeto al que se ha aplicado la conversión que se acaba de crear es una copia del objeto de clase __value. Por tanto, las modificaciones realizadas al valor del objeto al que se ha aplicado la conversión boxing no afectan al contenido del objeto de la clase __value.
Ejemplo
A continuación se muestra un ejemplo de lo que realiza una conversión boxing y una conversión 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);
}
En el ejemplo siguiente, un tipo de valor no administrado (V) es objeto de una conversión boxing y se como parámetro administrado a la función 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);
}
10 20