7.CSharp中浅拷贝和深拷贝的区别
7.1 题目
浅拷贝和深拷贝的区别是什么?它们分别有哪些场景使用?可以举例说明。
7.2 深入解析
在C#中,浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是两种不同的对象复制方式,它们的区别在于复制的内容和效果。
浅拷贝(Shallow Copy)
定义:
- 浅拷贝会复制对象自身(如
MemberwiseClone),但对象内的引用类型字段仍指向原实例,修改嵌套引用会影响副本与原对象。若仅做A = B式的引用赋值,则两个变量共享同一对象,与「浅拷贝对象」略有不同,面试时需区分表述。
- 浅拷贝会复制对象自身(如
示例:
- 当一个对象 A 被浅拷贝给另一个对象 B 时,修改对象 A 的内容会影响到对象 B。
举例:
obj2 = obj1只是两个引用指向同一对象,不是「拷贝对象」;浅拷贝常见如MemberwiseClone(),新对象与原对象共享子引用。
使用场景:
- 比如配置表和不变的数据,使用浅拷贝可以节约内存。
深拷贝(Deep Copy)
定义:
- 深拷贝将对象及其所有值都复制一份,创建一个全新的对象。即两个对象互相独立,修改其中一个对象的值不会影响另一个对象。
示例:
- 当一个对象 A 被深拷贝给另一个对象 B 时,修改对象 A 的内容不会影响到对象 B。
举例:
- 如果想要深拷贝,可以通过递归复制对象的所有成员,或者使用序列化和反序列化来实现。简单处理就是通过
new关键字创建一个新的对象及其成员。
- 如果想要深拷贝,可以通过递归复制对象的所有成员,或者使用序列化和反序列化来实现。简单处理就是通过
使用场景:
- 拷贝过来希望独立,改变拷贝对象不会影响原对象的功能(彼此独立)。
总结
浅拷贝:
- 只复制对象的引用地址,两个对象指向同一内存地址,修改其中一个对象的值会影响到另一个对象。
深拷贝:
- 复制对象及其所有值,创建一个全新的对象,两个对象互相独立,修改其中一个对象的值不会影响另一个对象。
7.3 答题示例
“浅拷贝只复制对象本身的字段或属性引用(如通过
MemberwiseClone),因此源对象和目标对象会共享相同的子对象;深拷贝会递归复制所有对象及其成员(可以用序列化/反序列化或手动复制实现),生成完全独立的副本,互不影响。”
7.4 关键词联想
浅拷贝 (Shallow Copy)- 引用共享
MemberwiseClone- 子对象不复制
深拷贝 (Deep Copy)- 完整复制
- 序列化/手动复制
- 独立副本
影响范围
- 浅拷贝:修改源或目标的子对象互相影响
- 深拷贝:互不干扰
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com