ようこそ。睡眠不足なプログラマのチラ裏です。

boxingとunboxing

ボックス化(boxing)とは、基本型(primitive type)からオブジェクト型(object type)へ変換することです。
その逆ををボックス化解除(unboxing)と呼びます。
これはつまり、値型と参照型を必要に応じて相互変換する機能です。
boxingは値型を参照型に変換する仕組みで、これは値のコピーを含みます。
つまりboxingとは、実体をコピーして、新たな参照の箱に詰め込むことを意味します。


Javaではprimitive typeとそのラッパークラスの変換を明示的にする必要がありますが、
.NET Framework(VB.NET,C#)のもとではコンパイラがそれを自動でしてくれる。 *1


いわゆるオブジェクト指向言語と呼ばれるものの上では、
パフォーマンスの都合上、単純な数値や文字列はオブジェクトとして扱われない*2
基本型とそのラッパークラスの変換を行う場合、明示的にする必要がある。
しかし、.NET Framework(VB.NET,C#)のもとでは、boxing/unboxingという機構により、
それが使われる場面をコンパイラが自動的に判別し、必要であればコンパイラがラッパ・オブジェクトを自動生成してくれる。


以下、C#サンプルコード(boxing/unboxing)

class Test1
{
    internal int Value;
}

struct Test2
{
    internal int Value;
}

private void button1_Click(object sender, System.EventArgs e)
{
    Test1 t = new Test1();
    t.Value = 100;

    Test1 o1 = t;
    Test1 o2 = o1;
    Test1 o3 = o2;

    o2.Value += 1;
    o3.Value -= 1;

    System.Console.WriteLine(o1.Value);
    System.Console.WriteLine(o2.Value);
    System.Console.WriteLine(o3.Value);
}

結果:
100
100
100

private void button2_Click(object sender, System.EventArgs e)
{
    Test2 t = new Test2();
    t.Value = 100;

    Test2 o1 = t;
    Test2 o2 = o1;
    Test2 o3 = o2;

    o2.Value += 1;
    o3.Value -= 1;

    System.Console.WriteLine(o1.Value);
    System.Console.WriteLine(o2.Value);
    System.Console.WriteLine(o3.Value);
}

結果:
100
101
99

*1:J2SE 5.0からJavaでもboxing/unboxingの機構が提供されました。

*2:オブジェクトとして取り扱いたければ、ラッパ・オブジェクトを生成しカプセル化する必要がある