C#でのオブジェクトコピーについて

オブジェクト(インスタンス)のコピーを作ることを Clone というが、これにはシャローコピー(Shallow Copy) とディープコピー(Deep Copy)がある。

シャローコピーの例

public MyClass Clone()
{
	return base.MemberwiseClone() as MyClass;
}
.NET のオブジェクトに用意されているこの MemberWiseClone() メソッドはシャローコピー

ディープコピーの例

ディープコピーは全部のインスタンス内の参照型のメンバについてもインスタンスそのものがコピーされる。

public static class Util
{
	/// ディープコピーを作成する。
	/// クローンするクラスには SerializableAttribute 属性、
	/// 不要なフィールドは NonSerializedAttribute 属性をつける。
	public static T CloneDeep(this T target)
	{
		object clone = null;
		using (MemoryStream stream = new MemoryStream())
		{
			BinaryFormatter formatter = new BinaryFormatter();
			formatter.Serialize(stream, target);
			stream.Position = 0;
			clone = formatter.Deserialize(stream);
		}
		return (T)clone;
	}
}

CloneDeep を使うクラスには SerializableAttribute 属性をつけておく必要がある。

[Serializable]
public class MyClass
{
}

inserted by FC2 system