Freigeben über


__box

 

Veröffentlicht: Juli 2016

Hinweis

Dieses Thema gilt nur für Version 1 von Managed Extensions für C++. Diese Syntax sollte nur verwendet werden, um Code von Version 1 beizubehalten. Finden Sie unter Boxing (C++ Component Extensions) Informationen zur Verwendung der entsprechenden Funktionalität in der neuen Syntax.

Erstellt eine verwaltete Kopie eines __value-Klassenobjekts.

Syntax

__box(
value-class identifier
)

Hinweise

Das Schlüsselwort __box wird verwendet, um ein verwaltetes Objekt (abgeleitet von System::ValueType) aus einem vorhandenen __value-Klassenobjekt zu erstellen. Wenn das __box-Schlüsselwort auf eine __value-Klasse angewendet wird:

  • Ein verwaltetes Objekt wird auf dem Common Language Runtime-Heap zugeordnet.

  • Der aktuelle Wert des __value-Klassenobjekts wird bitweise in das verwaltete Objekt kopiert.

  • Die Adresse des neuen verwalteten Objekts wird zurückgegeben.

Dieser Prozess wird als Boxing bezeichnet. Dadurch kann jedes __value-Klassenobjekt in generischen Routinen verwendet werden, die für ein beliebiges verwaltetes Objekt funktionieren, da das verwaltete Objekt indirekt von System::Object erbt (da System::ValueType von System::Object erbt).

Hinweis

Das neu erstellte geschachtelte Objekt ist eine Kopie des __value-Klassenobjekts. Daher wirken sich Änderungen am Wert des geschachtelten Objekts nicht auf den Inhalt des __value-Klassenobjekts aus.

Beispiel

Hier sehen Sie ein Beispiel für Boxing und 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);
}

Im folgenden Beispiel wird ein nicht verwalteter Werttyp (V) geschachtelt und als verwalteter Parameter an die Funktion Positive übergeben.

// 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