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