C# Programming

Image

Boxing (ボックス化)

開発環境: Visual Studio 2003 

ボックス化により、異なるタイプのオブジェクトをまとめて取り扱うことができます。

例 object [] oarray = {123, 1.23, "Hello World!", a};

ボックス化で注意しなければならないことは、ヒープ上にオブジェクトがコピーされることです。

Stack Heap
int a =123 123
object o = a @o Image object type == int 123
i= 456 456

 

Stack Heap
string str = "Hello" @"Hello" "Hello"
object o = str @o Image object type == string @str
str = "Hello2" @"Hello2" "Hello2"

str="Hello2"では、別の文字列が代入されている。

 

using System;

namespace TestBoxing
{
        /// <summary>
        /// Class1 の概要の説明です。
        /// </summary>
        class Class1
        {
                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main(string[] args)
                {
                        int i = 123;
                        object o = i;  // ヒープ上に123がコピーされる。
                        i = 456;       // スタック上に456がコピーされる。
                        Console.WriteLine("i = {0} ", i);    // スタック上のi が変更される。
                        Console.WriteLine("object o = {0}", o); // ヒープ上はそのまま

                        string str = "Hello World!";  // 文字列の実体はヒープ上
                        o = str;  // o は、ヒープ上のstr object を指す。
                        str = "Hello World2!";  // str は新しい文字列を指す。
			// o は、もともとのstrを指している。
                        Console.WriteLine("\nobject o = {0}:\t{1}", o.GetType(), o);  
			// str は、新しい文字列をさす。
                        Console.WriteLine("str = {0}\n", str);  

                        int [] a = {0,1,2,3,4};
                        object [] oarray = {123, 1.23, "Hello World!", a};

                        foreach(object obj in oarray)
                        {
                                Console.WriteLine("{0}:\t{1}", obj.GetType(), obj);
                        }
                }
        }
}
実行結果
Image