浅度和深度复制从一个变量到另一个变量按值复制对象,而不是按引用复制对象(即以与结构相同的方式复制)可能非常复杂。为什么呢?因为一个对象可能包含许多其他对象的引用,字段成员等,这将涉及许多繁琐的操作。要把每个成员从一个对象复制到另一个对象中?不,不会那么简单,因为其中一些成员可能是引用类型。.NET Framework显然深思熟虑,考虑了这个问题。简单地按照成员复制对象可以通过派生于System.Object的MemberwiseClone()方法来完成,这是一个受保护的方法,但很容易在对象上定义一个调用该方法的公共方法。你觉得这个方法是不是很方便?但要注意,这个方法提供的复制功能称为浅度复制(shallow copy),因为它没有考虑引用类型成员。因此,新对象中的引用成员就会指向与源对象中相同成员的对象,这种情况在许多情况下可能不理想。如果你想创建成员的新实例(复制值,而不复制引用),你需要使用深度复制(deep copy)。你可以实现一个ICloneable接口,以标准的方式来进行。如果使用这个接口,就必须实现它包含的Clone()方法。这个方法返回一个类型为System.Object的值。你可以采用各种处理方式,执行所选的任何一个方法体得到这个对象。如果愿意,你可以进行深度复制——但这并不是必选的,所以你可以按照需要执行浅度复制。详见第11章。

我们讨论了如何在C#中定义类和接口,把第8章的理论以更具体的方式表达出来。基本声明所需要的C#语法和可使用的可访问关键字,继承接口和其他类的方式,如何定义抽象和密封类以控制这种继承,以及如何定义构造函数和析构函数。介绍了每System.Object,它是我们所定义的所有类的基类。这个类提供了几个方法,其中一些是虚拟的,所以可以重写它们的实现代码。这个类还可以把任何对象实例当作这个类的实例,对任意对象应用多态性。我们还研究了VS和VCE为OOP开发提供的一些工具,包括“类视图”(Class View)窗口、“对象浏览器”(Object Browser)窗口,以及给项目添加新类的快速方法。在扩展“多文件”这个概念时,我们还介绍了如何创建程序集,程序集虽然不能运行,但它保护可以在其他项目中使用的类定义。接着深入探讨了抽象类和接口,理解它们的共同和不同之处,以及使用它们的场合。讨论了引用类型和值类型,较详细地介绍了结构(对象的值类型)。这引出了浅度复制和深度复制对象的讨论,该主题将在本书的后面再次讨论。你是否已经在期待更深入的讨论了呢?第10章将介绍如何定义类成员,如属性和方法,以便在C#中利用OOP创建真正的应用程序。