ボックス化

C++/CLIではすべての型はObject型から派生しているとしています。Objectはref classです。しかしint,charなどの基本型やvalue classなどは、Object型から派生しているとみなさないですむ場合はそうしたほうが高速にプログラムを動かせるのでそうしています。

このような型でも、Objectとみなしたい場合、ボックス化が行われます。ボックス化とは値型データを、マネージヒープ上に箱(メモリ)を確保しそこにコピーする作業です。コピーしたものは本物のObject派生型になります。

基本型をObjectとみなしたい例として、コレクション型を作るとき、コレクションへの追加関数として、Add(Object^ o)と定義する場合などがあります。

以下のように書くと、ハンドルは常にマネージヒープを指しているので、2 がボックス化されaがそれを指すようになります。

    int^ a = 2;

サンプルプログラム:

void PrintObject(Object^ o)
{
	System::Console::WriteLine(o->ToString());
}
ref class R
{
};
value class V
{
};
int main()
{
	R r1;
	R^ r2 = gcnew R;
	V v1;
	V^ v2 = gcnew V;
	int a = 2;
	char c = 'a';
	PrintObject(%r1);    // スタックライクをハンドルに代入するには % を使います。
	PrintObject(r2);
	PrintObject(v1);     // ボックス化
	PrintObject(v2);
	PrintObject(a);      // ボックス化
	PrintObject(c);      // ボックス化
	PrintObject("AAA");  // ボックス化 (String^)
}