深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。
C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此 对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。
看看定义:
浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.
浅拷贝和深拷贝的区别
浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一 个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对 象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。
下面通过实例可以清楚看到浅拷贝与深拷贝的区别,代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace WindowsApplication1 6 { 7 class Program 8 { 9 public class Sex 10 { 11 private string _PSex; 12 public string PSex 13 { 14 set 15 { 16 _PSex = value; 17 } 18 get 19 { 20 return _PSex; 21 } 22 } 23 24 } 25 26 public class Person : ICloneable 27 { 28 29 private Sex _pSex = new Sex(); 30 public int aa = 1213; 31 32 public string pSex 33 { 34 set 35 { 36 _pSex.PSex = value; 37 } 38 get 39 { 40 return _pSex.PSex; 41 } 42 } 43 private string _PName; 44 public string PName 45 { 46 set 47 { 48 this._PName = value; 49 } 50 get 51 { 52 return this._PName; 53 } 54 } 55 56 public void ShowPersonInfo() 57 { 58 Console.WriteLine("-------------------------"); 59 Console.WriteLine("Name:{0} Sex:{1}", _PName, this.pSex); 60 Console.WriteLine("-------------------------"); 61 Console.WriteLine(this.aa); 62 } 63 //浅拷贝 64 public object Clone() 65 { 66 return this.MemberwiseClone(); 67 } 68 //深拷贝 69 public object DeepClone() 70 { 71 Person newP = new Person(); 72 newP.PName = this._PName; 73 newP.pSex = this.pSex; 74 return newP; 75 } 76 77 } 78 79 static void Main(string[] args) 80 { 81 Console.WriteLine("原对象:"); 82 Person p = new Person(); 83 p.PName = "JackLee"; 84 p.pSex = "男"; 85 86 p.ShowPersonInfo(); 87 88 89 //浅拷贝 90 Person copy = (Person)p.Clone(); 91 //深拷贝 92 Person dcopy = (Person)p.DeepClone(); 93 94 95 Console.WriteLine("修改后的原对象:"); 96 p.PName = "JackZhao"; 97 p.pSex = "女"; 98 p.aa = 1111; 99 p.ShowPersonInfo(); 100 101 102 Console.WriteLine("修改后的浅拷贝对象:"); 103 copy.ShowPersonInfo(); 104 Console.WriteLine("修改后的深拷贝对象:"); 105 dcopy.ShowPersonInfo(); 106 107 Console.WriteLine("直接拷贝对象:"); 108 Person PP = p; 109 PP.ShowPersonInfo(); 110 111 Console.ReadLine(); 112 113 114 } 115 116 } 117 }
好了,关于深拷贝与浅拷贝就说到这里,项目还没完事,先抓紧了。代码可以直接复制到项目中运行。