C#类型系统—浅拷贝和深拷贝
1 浅拷贝
浅拷贝指拷贝一个对象时,仅仅拷贝对象的引用,但是拷贝对象和原对象还是引用同一份实体。此时,一个对象的改变都会影响到另一个对象。
所谓的浅拷贝,是指拷贝一个对象的时候,拷贝原始对象中所有的非静态值类型成员和所有的引用类型成员的引用。换言之,新的对象和原始对象将共享所有引用类型成员的实际对象。
浅拷贝实现:调用MemberwiseClone方法。
2 深拷贝
拷贝一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样进行深拷贝后的副本对象就和源对象互相独立。即深拷贝不仅复制所有的非静态值类型成员,而且也复制所有引用类型成员的实际对象。
深拷贝实现:
①依照官方文档,实现默认的复制构造函数。即显式的增加一个带有类引用的构造函数来创建一个新对象。
②标准做法,实现ICloneable接口,在clone方法中实现深拷贝(当然也可以实现浅拷贝)。
③利用反射实现深拷贝(拷贝的类无互相引用)。
④利用序列化和反序列化实现(分为xml序列化、二进制序列化、json)。
⑤表达式树实现。表达式树比反射快,反射比序列化快。