__box

 

発行: 2016年4月

注意

このトピックは、C++ マネージ拡張のバージョン 1 にのみ対応しています。 この構文は、バージョン 1 のコードを保守するためだけに使用してください。 参照してください Boxing (C++ Component Extensions) については、新しい構文で同等の機能を使用します。

__value クラスのオブジェクトのマネージ コピーを作成します。

構文

__box(
value-class identifier
)

解説

__box キーワードは、既存の __value クラスのオブジェクトからマネージ オブジェクト (System::ValueType から派生するオブジェクト) を作成するために使用されます。__box キーワードを __value クラスに適用すると、次の処理が実行されます。

  • マネージ オブジェクトが共通言語ランタイム ヒープに割り当てられます。

  • __value クラスのオブジェクトの現在の値が、マネージ オブジェクトにビット単位でコピーされます。

  • 新しいマネージ オブジェクトのアドレスが返されます。

このプロセスをボックス化と呼びます。 ボックス化を実行すると、System::ValueTypeSystem::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