原文链接:http://club.topsage.com/thread-2457830-1-1.html
这里讨论的浅表副本与深表副本主要是针对C#的类来说的,我们知道C#的类都是引用类型的,然而类的字段则有可能是值类型和引用类型的。
个人认为浅表副本与深表副本就区分于此。假设我们现在有一个class叫做MyCopyableClass,里面包含有一个值类型string name,和一个引用类型Info information(Info是一个class)。该类里我们生成两个方法ShallowCopy和DeepCopy来分别实现浅表副本和深表副本
1.利用ShallowCopy方法实现浅表副本
那么该方法只需一行代码 return (MyCopyableClass)this.MemberwiseClone();即可实现浅表副本。因为这里MyCopyableClass字段既有值类型也有引用类型。那么对于值类型,副本将在新的内存块中复制值类型的值;而对于引用类型,副本则将同样引用原先的引用类型。也就是说,如果原先的MyCopyableClass字段中的值发生变化,副本字段中的值不发生变化;而如果字段中的引用对象发生变化,则副本中的引用对象也发生变化。
2.利用DeepCopy方法实现深表副本
深表副本主要是针对MyCopyableClass字段里的引用类型的,这样子如果当原先的MyCopyableClass字段中的引用发生变化,然而副本却不发生任何的变化。
相应的例子代码如下所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Ch10Ex4 { class Info { private int idNumber; public Info(int idNumber) { this.idNumber = idNumber; } public int IdNumber { get { return idNumber; } set { idNumber = value; } } } class MyCopyableClass { private Info information; private string name; public Info Information { get { return information; } set { information = value; } } public string Name { get { return name; } set { name = value; } } public MyCopyableClass ShallowCopy() { return (MyCopyableClass)this.MemberwiseClone(); } public MyCopyableClass DeepCopy() { MyCopyableClass other = (MyCopyableClass)this.MemberwiseClone(); other.information = new Info(this.information.IdNumber); return other; } } class Program { static void Main(string[] args) { MyCopyableClass person = new MyCopyableClass(); person.Name = "Huachi"; person.Information = new Info(442); MyCopyableClass shallow = person.ShallowCopy(); Display(person); Display(shallow); person.Name = "Woo"; person.Information.IdNumber = 42; Display(person); Display(shallow); MyCopyableClass deep = person.DeepCopy(); person.Name = "4T-Shirt"; person.Information.IdNumber = 1; Display(person); Display(deep); } static void Display(MyCopyableClass person) { Console.WriteLine("My name is {0} and idnumber is {1}", person.Name, person.Information.IdNumber); } } }