深度复制
第9章通过下面的GetCopy()方法,介绍了如何使用受保护的方法System.Object.MemberwiseClone()
进行浅度复制。
public class Cloner
{
public int Val;
public Cloner(int newVal)
{
Val = newVal;
}
public object GetCopy()
{
return MemberwishClone();
}
}
假定有引用类型的字段,而不是值类型的字段(例如,对象):
public class Content
{
public int Val;
}
public class Cloner
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
public object GetCopy()
{
return MemberwishClone();
}
}
此时,通过GetCopy()
得到的浅度复制包括一个字段,它引用的对象与源对象相同。以下代码使用这个Cloner
类来说明浅度复制引用类型的结果:
Cloner mySource = new Cloner(5);
Cloner myTarget = (Cloner)mySource.GetCopy();
Console.WriteLine("myTarget.MyContent.Val = {0}", myTarget.MyContent.Val);
mySource.MyContent.Val = 2;
Console.WriteLine("myTarget.MyContent.Val = {0}", myTarget.MyContent.Val);
第4行把一个值赋给mySource.MyContent.Val
,它是源对象中公共字段MyContent
的公共字段Val
。这也改变了myTarget.MyContent.Val
的值。这是因为mySource.MyContent
引用了与myTarget.MyContent
相同的对象实例。上述代码的输出结果如下:
myTarget.MyContent.Val = 5
myTarget.MyContent.Val = 2