深度复制

  第9章通过下面的GetCopy()方法,介绍了如何使用受保护的方法System.Object.MemberwiseClone()进行浅度复制。

  1. public class Cloner
  2. {
  3. public int Val;
  4. public Cloner(int newVal)
  5. {
  6. Val = newVal;
  7. }
  8. public object GetCopy()
  9. {
  10. return MemberwishClone();
  11. }
  12. }

  假定有引用类型的字段,而不是值类型的字段(例如,对象):

  1. public class Content
  2. {
  3. public int Val;
  4. }
  5. public class Cloner
  6. {
  7. public Content MyContent = new Content();
  8. public Cloner(int newVal)
  9. {
  10. MyContent.Val = newVal;
  11. }
  12. public object GetCopy()
  13. {
  14. return MemberwishClone();
  15. }
  16. }

  此时,通过GetCopy()得到的浅度复制包括一个字段,它引用的对象与源对象相同。以下代码使用这个Cloner类来说明浅度复制引用类型的结果:

  1. Cloner mySource = new Cloner(5);
  2. Cloner myTarget = (Cloner)mySource.GetCopy();
  3. Console.WriteLine("myTarget.MyContent.Val = {0}", myTarget.MyContent.Val);
  4. mySource.MyContent.Val = 2;
  5. Console.WriteLine("myTarget.MyContent.Val = {0}", myTarget.MyContent.Val);

  第4行把一个值赋给mySource.MyContent.Val,它是源对象中公共字段MyContent的公共字段Val。这也改变了myTarget.MyContent.Val的值。这是因为mySource.MyContent引用了与myTarget.MyContent相同的对象实例。上述代码的输出结果如下:

  1. myTarget.MyContent.Val = 5
  2. myTarget.MyContent.Val = 2