什么是浅复制以及它与 C# 中的深复制有何不同?

什么是浅复制以及它与 C# 中的深复制有何不同?
最新回答
轻拥

2021-12-02 07:08:52

浅复制(Shallow Copy) 是指创建一个新对象,但仅复制原始对象的顶层字段。若字段是引用类型(如类实例、数组等),新对象中的这些字段会共享原始对象的引用,而非创建独立副本。这意味着修改其中一个对象的引用类型字段时,另一个对象也会受到影响。

深复制(Deep Copy) 则会递归复制整个对象结构,包括所有引用类型的子对象。新对象与原始对象完全独立,修改任一对象的任何字段都不会影响另一个对象。

两者的核心区别如下

  1. 复制范围

    浅复制仅复制值类型字段和引用类型字段的引用地址。

    深复制会复制所有字段,包括引用类型字段指向的实际数据。

  2. 对象独立性

    浅复制的对象与原始对象不独立,共享内部引用。

    深复制的对象与原始对象完全独立,无任何关联。

  3. 实现方式

    浅复制可通过直接赋值(如 obj1 = obj)或调用 MemberwiseClone() 方法实现。

    深复制需手动实现(如通过序列化、递归复制或实现 ICloneable 接口)。

示例说明
在提供的代码中:

  • 浅复制通过 obj1 = obj 实现,修改 obj1.a 会同步影响 obj.a(输出 5,5)。
  • 深复制通过 d1.a = d.a(仅复制值类型)实现,修改 d1.a 不影响 d.a(输出 5,10)。若存在引用类型字段,需额外处理其深复制逻辑。

应用场景

  • 浅复制适用于对象无嵌套引用或需共享内部数据的场景。
  • 深复制适用于需要完全隔离修改的复杂对象结构。