ボクシング
C# では、値型は直接スタック上に格納されるが、参照型は参照のみスタック、実体はヒープ上に確保される。ところが C# ではすべてのデータ型が object 型(System.Object)を継承しているため、値型の値も object 型に代入が可能だったりする。
object 型は、.NET Framework の Object のエイリアスです。C# の統一型システムでは、定義済みの型やユーザー定義の型、参照型や値型など、すべての型が、Object から直接的または間接的に継承されます。任意の型の値を object 型の変数に代入できます。値型の変数をオブジェクトに変換することを "ボックス化" と言います。型オブジェクトの変数を値型に変換することを "ボックス化解除" と言います。詳細については、「ボックス化とボックス化解除」を参照してください。 http://msdn.microsoft.com/ja-jp/library/9kkx3h3c(VS.80).aspxボックス化はボクシングとも呼ばれる。こちらのほうが好みだな。パンチ!パンチ!
class Test { static void Main () { int num = 2000; // int は値型 object box = num; // ボクシング変換 num += 2500; // 元の値型を変更する System.Console.WriteLine (num); // 元の値型は更新されている System.Console.WriteLine (box); // こちらはヒープ上にコピーが作られているため更新されない num = (int) box; // アンボクシング変換 System.Console.WriteLine (num); // ちゃんとキャストされたことがわかる } }上記のコードを実行すると出力結果は下のようになる。
4500 2000 2000ボクシング変換を行うとヒープ上に object 型の実体が生成され、2000という値もヒープにコピーされる。元の変数を更新しても、ヒープ上の値は更新されない。
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2136
コメント