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