C#面试题更新 2026-08-05

在 C# 里,有哪些方式能够实现对象的浅拷贝与深拷贝?请说明它们的区别以及各自的实现思路。

技术原理C#

考察说明

考查对 C# 对象拷贝机制的理解,以及区分浅拷贝与深拷贝的能力。

回答思路

  1. 【回答框架 1】浅拷贝是指复制对象时仅复制值类型字段和引用类型字段的引用,新对象与原始对象共享同一份引用类型对象,修改其中一个会影响另一个。C# 中可用 MemberwiseClone 方法实现浅拷贝,该方法属于 object 类且受保护,需要在类内部调用。
  2. 【回答框架 2】深拷贝则是连同引用类型对象的内容一起复制,得到完全独立的对象,修改互不影响。常见的实现方式包括手动复制每个字段、使用反射遍历字段并递归复制,或者利用序列化。
  3. 【回答框架 3】序列化方式较为通用,例如使用 BinaryFormatter 或 JSON 序列化(如 System.Text.Json 或 Newtonsoft.Json),但需要注意对象需标记 [Serializable],且可能受序列化机制限制。对于复杂对象图,手动或反射方式更可靠。
  4. 【回答框架 4】选择深拷贝时应考虑性能、循环引用、不可变对象以及是否需要自定义拷贝逻辑。使用序列化可能无法处理所有类型,如带文件句柄或线程资源的类型。
  5. 【关键点 1】MemberwiseClone 只实现浅拷贝,值类型字段复制值,引用类型字段复制引用。
  6. 【关键点 2】深拷贝常用反射、序列化或手动逐字段复制,序列化需类型支持序列化。
  7. 【关键点 3】浅拷贝与原对象共享引用,深拷贝完全独立。
  8. 【易错点 1】误用 MemberwiseClone 当作深拷贝会留下共享引用,后续修改可能意外影响原始对象。
  9. 【易错点 2】序列化深拷贝可能遇到循环引用,导致递归或异常。
  10. 【易错点 3】对不可变类型或频繁拷贝的场景,深拷贝可能带来不必要的性能开销。