深拷贝与浅拷贝
浅拷贝:只复制对象的基本类型,对象类型,仍属于原来的引用
深拷贝:不仅复制对象的基本类,同时也复制原来对象中的对象
c#中有两种类型变量,一种是值类型变量,一种是引用类型便利那个,对于值类型便利那个,深拷贝和浅拷贝都是通过复制操作实现的,其效果是一样的,将对象中的值类型的字段拷贝到新的对象中。这个很容易理解。本文重点讨论引用类型变量的拷贝机制和实现。
C#中引用类型对象的Copy操作有两种
为是上面说到的俩种。
浅拷贝和深拷贝的区别:
浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用字段则指复制它的一个额饮用到目标对象
注意: string类型有点特殊,对于浅拷贝,按类值类型对象进行处理。
浅拷贝的实现
1 使用Ojbect类MemberwiseClone实现
MemberwiseClone:创建当前Object的浅拷贝副本
MemberwiseClone方法创建一个浅表副本,方式是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制,如果该字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一个对象。
示例代码:
public class Person
{
public int Age { get; set; }
public string Address { get; set; }
public Name Name { get; set; }
public object Clone()
{ return this.MemberwiseClone(); } }
public class Name
{
public Name(string frisName,string lastName)
{ FristName = frisName;
LastName = lastName; }
public string FristName { get; set; }
public string LastName { get; set; }
}
2 复制操作与使用Object类MemberwiseClone实现
对于引用类型的变量,我们有种误解,认为复制操作就是一种浅拷贝,其实是有区别的。
1浅拷贝对于引用类型对象中的值类型字段进行了逐位复制。赋值运算符只是把源对象的引用赋值给目的对象,两者引用同一个对象。
2浅拷贝后的对象的值类型字段更改不会反映到源对象,而赋值运算后的对象类型字段更改会反映到源对象。
深拷贝的实现
相对于浅拷贝是指依照源对象为原型,创建一个新对象,将当前对象的所有字段进行执行逐位复制并支持递归,不管是值类型还是引用类型,不管是静态字段还是非静态字段。