Sdílet prostřednictvím


__box

 

Publikováno: duben 2016

Poznámka

Toto téma se týká pouze verze 1 spravovaných rozšíření jazyka C++. Tato syntaxe by měla sloužit pouze k udržování kódu verze 1. Viz Boxing (C++ Component Extensions) informace o použití ekvivalentní funkce v nové syntaxi.

Vytvoří kopii objektu třídy __value spravované.

Syntaxe

__box(
value-class identifier
)

Poznámky

__box Klíčové slovo se používá k vytvoření spravovaného objektu (odvozené z System::ValueType) z existujícího objektu třídy __value. Když __box klíčové slovo je aplikován na třídu __value:

  • Spravovaný objekt je přidělen na haldě běžné language runtime.

  • Aktuální hodnota objektu třídy __value bit-wise zkopírována do spravovaného objektu.

  • Adresa nový spravovaný objekt je vrácen.

Tento proces se označuje jako zabalení. To umožňuje, aby jakýkoli objekt třídy __value se používá v obecné rutiny, která pracují pro jakýmkoliv spravovaným objektem, protože spravovaný objekt nepřímo dědí z System::Object (protože System::ValueType dědí z System::Object).

Poznámka

Nově vytvořený objekt zabalený je kopie objektu __value třídy. Úpravy na hodnotu zabalený objektu proto nemají vliv obsah __value objektu třídy.

Příklad

Zde je příklad, který provádí zabalení a rozbalení:

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

V následujícím příkladu je typ nespravované hodnoty (V) je nejprve zabalen a předán jako spravovaný parametr Positive funkce.

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