使用直接赋值后两个对象就完全一样,随着改变一个对象的值另一个对象的值也随之改变。
浅拷贝,对象中的值类型互补影响,但是引用类型(string虽然是引用类型但特殊存在类值类型)随着一个对象的值改变另一个也会改变。
深拷贝,两个对象完全独立互补影响
1 class Program 2 { 3 4 public class Person{ 5 6 public int age; 7 8 public string name; 9 public Object Clone() { 10 return this.MemberwiseClone(); 11 } 12 13 } 14 15 public class ClassA : ICloneable 16 { 17 18 public string classname; 19 20 public Person person=new Person(); 21 22 public Object Clone() 23 { 24 25 return this.MemberwiseClone();//潜拷贝 26 }
//深拷贝 27 public Object DeepClone() 28 { 29 ClassA cloneA = new ClassA(); 30 cloneA.classname = this.classname; 31 //cloneA.person.age = this.person.age; 32 //cloneA.person.name = this.person.name; 33 cloneA.person = (Person)this.person.Clone(); 34 return cloneA; 35 } 36 37 } 38 39 static void Main(string[] args) 40 { 41 42 43 ClassA class1=new ClassA(); 44 45 46 Person p=new Person(); 47 48 p.age=18; 49 50 p.name="jack"; 51 52 class1.person=p; 53 54 class1.classname = "班级1"; 55 56 ClassA class2 = class1; 57 ClassA class3 = (ClassA)class1.Clone(); 58 ClassA class4=(ClassA)class1.DeepClone(); 59 Console.WriteLine("class1---"+class1.classname + "---" + class1.person.name +"----"+ class1.person.age+"/n"); 60 Console.WriteLine("直接赋值---"+class2.classname + "---" + class2.person.name +"----"+ class2.person.age+"/n"); 61 Console.WriteLine("潜拷贝---"+class3.classname + "---" + class3.person.name +"----"+ class3.person.age+"/n"); 62 Console.WriteLine("深拷贝---"+class4.classname + "---" + class4.person.name +"----"+ class4.person.age+"/n"); 63 Console.WriteLine("变跟后"); 64 class1.classname = "班级变更"; 65 class1.person.age = 22; 66 class1.person.name = "Lee"; 67 Console.WriteLine("class1---"+class1.classname + "---" + class1.person.name +"----"+ class1.person.age+"/n"); 68 Console.WriteLine("直接赋值---"+class2.classname + "---" + class2.person.name +"----"+ class2.person.age+"/n"); 69 Console.WriteLine("潜拷贝---"+class3.classname + "---" + class3.person.name +"----"+ class3.person.age+"/n"); 70 Console.WriteLine("深拷贝---"+class4.classname + "---" + class4.person.name +"----"+ class4.person.age+"/n"); 71 Console.Read(); 72 73 } 74 75 }
我们来看下输出结果
潜拷贝后值班级名字不受影像但是引用类型person随着改而值一起出现了变化从jace变成了lee。
而深拷贝并没有变化。直接赋值后两对象完全等同。