__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