< インデクサ | as >

July 18, 2008

ボクシング

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

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?