前言
在今天上午,项目经理问到了值类型的浅拷贝,我对此进行了一系列深度学习和测试,自己写了一个深拷贝浅拷贝的案例。下面跟大家分享一下学习的心得,最后奉上Demo,如有理解不当的地方,望各路大神不吝赐教
正文:
浅拷贝:
将对象中的所有字段复制到新的副本对象中;
浅拷贝对于值类型和引用类型的方式有区别,值类型字段的值被复制到副本中后,在副本中的修改不会影响对象源对象的值
浅拷贝对引用类型的字段被复制到副本中的 是引用类型的引用(地址),所以修改副本,源对象的值也将被改变。
深拷贝:
深拷贝也同样是将对象中的所有字段复制到副本对象中,
但是无论对象的值类型或引用类型字段,都会被重新创建并复制,对于副本的修改,不会影响到源对象的本身。
我的思考:
上面的描述,明显深拷贝会重新在内存上开辟一份空间,而浅拷贝在拷贝引用类型时传递是地址,修改副本时源对象也会被修改。那么总结可知,对于值类型的拷贝我们尽量去浅拷贝,这样就可以优化内存?
-----------------
无论是哪种拷贝,微软都建议使用类型继承ICloneable接口的方式告诉调用者,该对象是否可用被拷贝。
ICloneable接口只提供了一个声明为Clone的方法,我们可以根据需求在Clone的方法中实现拷贝
注意:
1、在 .NET 程序中,应该避免使用 ICloneable 接口。因为通过该接口无法判断究竟是浅拷贝还是深拷贝,这会造成误解或误用。
2、深拷贝应该复制该对象本身及通过该对象所能到达的完整的对象图,浅拷贝只复制对象本身(就是该对象所表示的在堆中的一块连续地址中的内容)。
经测试得出,.NET中值类型默认是深拷贝的,而对于引用类型默认实现的是浅拷贝,
所以对于类中引用类型的属性改变时其另一个对象也会发生改变
深拷贝的实现方式有:
1.反射
2.序列化
3.表达式树
我写了关于深拷贝与浅拷贝的测试以及具体实现代码放在了码云的仓库上:
ValueCopyDemo: 深拷贝和浅拷贝的实现 (gitee.com)https://gitee.com/meng-ruiqing/value-copy-demo
大家感兴趣可以下载下来测试一下。
好了今天的分享就到这里,感谢收看!