C_sharp / Study / ICloneable


はじめに

  • コピーを返すことが可能となる。
  • 簡易(浅い)コピーを返す際はSystem.Object.MemberwiseClone?()を返しておけばよい。
  • System.Object.MemberwiseClone?()は
    • フィールドが値型の場合、そのままオブジェクトのコピーが渡される
    • 参照型の場合は参照だけがコピーされる。このため注意が必要。
    • コピーはビット単位で行われる。

ICloneable概要

interface ICloneable
{
	Object Clone(); // このインスタンスのコピーである新しいオブジェクトを返す。
}

コード

// 普通のクラス
class MyClass
{
	int num;
	public MyClass(int num)
	{
		this.num = num;
	}

	public int Num
	{
		get { return this.num; }
		set { this.num = value; }
	}
}

// ICloneable実装クラス
class MyClassCloneable : System.ICloneable
{
	int num;
	public MyClassCloneable(int num)
	{
		this.num = num;
	}

	public int Num
	{
		get { return this.num; }
		set { this.num = value; }
	}

	public object Clone()
	{
		return MemberwiseClone();
	}
}

利用例

コード

static void Main(string[] args)
{
	MyClass a1 = new MyClass(10);
	MyClass a2 = a1;
	a1.Num = 20;

	Console.WriteLine("a1.Num = " + a1.Num);
	Console.WriteLine("a2.Num = " + a2.Num);

	MyClassCloneable b1 = new MyClassCloneable(10);
	MyClassCloneable b2 = (MyClassCloneable)b1.Clone();
	b1.Num = 20;

	Console.WriteLine("b1.Num = " + b1.Num);
	Console.WriteLine("b2.Num = " + b2.Num);
}

出力

a1.Num = 20
a2.Num = 20
b1.Num = 20
b2.Num = 10

MenuBar


最新の20件

2015-05-15 2014-12-07 2008-11-17 2007-08-30 2007-04-21 2007-03-13 2007-03-12 2007-02-20 2007-02-14 2007-02-04 2006-11-26 2006-11-23 2006-11-20 2006-11-18 2006-11-13

  • counter: 952
  • today: 1
  • yesterday: 0
  • online: 1