浅度和深度复制

  从一个变量到另一个变量按值复制对象,而不是按引用复制对象(即以与结构相同的方式复制)可能非常复杂。因为一个对象可能包含许多其他对象的引用,例如字段成员等,这将涉及许多繁琐的处理。把每个成员从一个对象复制到另一个对象中可能不会成功,因为其中一些成员可能是引用类型。

  .NET Framework 考虑了这个问题。简单地按照成员复制对象可以通过派生于 System.Object 的 MemberwiseClone() 方法来完成,这是一个受保护的方法,但很容易在对象上定义一个调用该方法的公共方法。这个方法提供的复制功能称为浅度复制(shallow copy),因为它并未考虑引用类型成员。因此,新对象中的引用成员就会指向源对象中相同成员引用的对象,在许多情况下这并不理想。如果要创建成员的新实例(复制值,而不复制引用),此时需要使用深度复制(deep copy)。

  可以实现一给 ICloneable 接口,以标准方式进行深度复制。如果使用这个接口,就必须实现它包含的 Clone() 方法。这个方法返回一个类型为 System.Object 的值。我们可以采用各种处理方式,实现所选的任何一个方法体得到这个对象。如果愿意,就可以进行深度复制(但不是必须执行深度复制,所以如果执行浅度复制更合适,就可以执行浅度复制)。对于该方法应该返回什么,并不存在规则或限制,所以许多人建议不要使用它。这些人建议实现自己的深度复制方法。第 11 章将详细介绍这个接口。