|
Boxing (ボックス化)
|
開発環境: Visual Studio 2003
ボックス化により、異なるタイプのオブジェクトをまとめて取り扱うことができます。
例 object [] oarray = {123, 1.23, "Hello World!", a};
ボックス化で注意しなければならないことは、ヒープ上にオブジェクトがコピーされることです。
|
Stack | |
Heap |
int
a =123 |
123 | | |
| | | |
object o = a |
@o |
|
object type == int
123 |
i=
456 |
456 | | |
|
Stack | |
Heap |
string
str = "Hello" |
@"Hello" | |
"Hello" |
| | | |
object
o = str |
@o |
|
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);
}
}
}
}