深拷贝、浅拷贝、直接赋值

使用直接赋值后两个对象就完全一样,随着改变一个对象的值另一个对象的值也随之改变。

浅拷贝,对象中的值类型互补影响,但是引用类型(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。

而深拷贝并没有变化。直接赋值后两对象完全等同。

原文地址:https://www.cnblogs.com/xuyufeng/p/4647347.html