C#中的浅拷贝(Shallow Copy)和深拷贝(Deep Copy)
拷贝就是创建一个对象,这个对象有着原始对象数据(属性和字段)的一份精确拷贝(只针对Object和Array这样的引用数据类型)。
换个说法就是:所谓的对象拷贝(复制)就是为对象创建副本,得到相同的对象。
浅拷贝(又称为影子拷贝):(1)如果对象属性的值是值类型和string类型,拷贝的就是基本类型的值;
(2)如果对象属性是引用类型,拷贝的就是引用类型(string除外)的引用(也就是堆地址);所以修改其中一个对象引用类型数据,会影响到另一个对象;
(3)浅拷贝使用的是Object.MemberwiseClone()方法。
浅拷贝出来的副本对象中,对象里的数据(属性和字段)如果是值类型和string类型,栈中保存的就是数据自身,在原始对象和副本对象中修改值类型数据,不会相互影响(因为值类型自身在栈中有不同的内存空间);如果是引用类型,浅拷贝只是拷贝引用类型的引用(也就是堆地址),所以在原始对象和副本对象中修改引用类型数据,会相互影响(因为原始对象和副本对象拥有同一个堆地址的引用)。
深拷贝:(1)完全将对象中的所有数据(属性和字段)都复制到副本对象中;
(2)引用类型的数据(属性和字段)会被重新创建并且复制;所以修改其中一个对象引用类型数据,不会影响到另一个对象。
深拷贝出来的副本对象中,对象里的数据(属性和字段)如果是值类型和string类型,栈中保存的就是数据自身在原始对象和副本对象中修改值类型数据,不会相互影响(因为值类型自身在栈中有不同的内存空间);如果是引用类型,深拷贝会重新创建引用类型的数据(属性和字段)并且复制原始对象中引用类型的数据的值(堆地址中保