ボックス化、ボックス化解除

ボックス化はJavaのオートボクシングと同じようなものだけど、ボックス化解除とJavaのオートアンボクシングは前者に比べて違いが大きい。


ボックス化は値型を参照型として扱うための仕組みで、Javaのオートボクシングのようなもの。

// intはSystem.Int32の別名
int a = 10;
// objectはSystem.Objectの別名
object obj = a;

ここで、object obj = a;の部分でボックス化が行われている。
Javaにはintに対応したIntegerがあるので、

int a = 10;
Integer i = a;

このようになる。


ボックス化解除はボックス化されたオブジェクトから値を取り出す仕組みだが、Javaのオートアンボクシングとは違って明示的に行う必要がある。

// ボックス化
object obj = 10;
// ボックス化解除
int a = (int) obj;
Console.WriteLine(a.ToString());

このように、キャストと同じ構文を使用するため、

int a = 10;
object obj = a;
a = 0;
int b = (int) obj;
Console.WriteLine(b.ToString());

このプログラムを実行したときに10が表示されてびびったりする。
あと、ReferenceEqualsメソッドの結果と==の結果が違ってびびったりもする。


ここら辺はどうにかならんものか・・・