学无止境,精益求精
十年河东,十年河西,莫欺少年穷
学历代表你的过去,能力代表你的现在,学习代表你的将来
最近拜读了大话设计模式:原型模式,该模式主要应用C# 深浅复制来实现的!关于深浅复制大家可参考MSDN:https://msdn.microsoft.com/zh-cn/library/system.object.memberwiseclone.aspx
所谓深浅复制可解读为:
浅复制:在C#中调用 MemberwiseClone() 方法即为浅复制。如果字段是值类型的,则对字段执行逐位复制,如果字段是引用类型的,则复制对象的引用,而不复制对象,因此:原始对象和其副本引用同一个对象!
深复制:如果字段是值类型的,则对字段执行逐位复制,如果字段是引用类型的,则把引用类型的对象指向一个全新的对象!
上述的解释可能看不太懂,我们作如下案例进行分析:
class Program { public static void Main() { //创建P1对象 Person p1 = new Person(); p1.Age = 42; p1.Name = "Sam"; p1.IdInfo = new IdInfo("081309207"); //通过浅复制 得到P2对象 Person p2 = p1.ShallowCopy(); //分别输出 Console.WriteLine("对象P1相关属性如下"); DisplayValues(p1); //p1.Name = ""; //p1.IdInfo.IdNumber = "XXXXX"; Console.WriteLine("对象P2相关属性如下"); DisplayValues(p2); //现在测试深复制 Person p3 = p1.DeepCopy(); p1.Name = "George"; p1.Age = 39; p1.IdInfo.IdNumber = "081309208"; Console.WriteLine("对象P1相关属性如下"); DisplayValues(p1); //p1.IdInfo.IdNumber = "CCCCCCC"; Console.WriteLine("对象P3相关属性如下"); DisplayValues(p3); Console.Read(); } public static void DisplayValues(Person p) { Console.WriteLine(" Name: {0:s}, Age: {1:d}", p.Name, p.Age); Console.WriteLine(" Value: {0:d}", p.IdInfo.IdNumber); } } public class IdInfo { public string IdNumber; public IdInfo(string IdNumber) { this.IdNumber = IdNumber; } } public class Person { public int Age; public string Name; public IdInfo IdInfo; public Person ShallowCopy() { return (Person)this.MemberwiseClone(); } public Person DeepCopy() { Person other = (Person)this.MemberwiseClone(); other.IdInfo = new IdInfo(IdInfo.IdNumber); other.Name = String.Copy(Name); return other; } }