__box
発行: 2016年4月
注意
このトピックは、C++ マネージ拡張のバージョン 1 にのみ対応しています。 この構文は、バージョン 1 のコードを保守するためだけに使用してください。 参照してください Boxing (C++ Component Extensions) については、新しい構文で同等の機能を使用します。
__value クラスのオブジェクトのマネージ コピーを作成します。
構文
__box(
value-class identifier
)
解説
__box キーワードは、既存の __value クラスのオブジェクトからマネージ オブジェクト (System::ValueType から派生するオブジェクト) を作成するために使用されます。__box キーワードを __value クラスに適用すると、次の処理が実行されます。
マネージ オブジェクトが共通言語ランタイム ヒープに割り当てられます。
__value クラスのオブジェクトの現在の値が、マネージ オブジェクトにビット単位でコピーされます。
新しいマネージ オブジェクトのアドレスが返されます。
このプロセスをボックス化と呼びます。 ボックス化を実行すると、System::ValueType が System::Object を継承した結果、マネージ オブジェクトが間接的に System::Object を継承するため、マネージ オブジェクトに対して動作するジェネリック ルーチンで、任意の __value クラスのオブジェクトを使用できます。
注意
新しく作成したボックス化されたオブジェクトは、__value クラスのオブジェクトのコピーです。 したがって、ボックス化されたオブジェクトの値を変更しても、__value クラス オブジェクトの内容には影響を与えません。
使用例
ボックス化とボックス化解除の例を次に示します。
// 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) がボックス化され、マネージ パラメーターとして 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