Share via


__box

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.Vea Conversión boxing implícita 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.

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