浅拷贝仅复制值类型字段和引用类型地址,深拷贝递归复制所有层级;MemberwiseClone是内置浅拷贝方法,JSON序列化是推荐的深拷贝方式,ICloneable接口不区分深浅且已不推荐使用。
在 C# 中,浅拷贝(Shallow Copy)只复制对象的值类型字段和引用类型的地址(即新旧对象共享同一引用对象),而深拷贝(Deep Copy)会递归复制所有层级的对象,确保新对象与原对象完全独立。实现方式有多种,ICloneable 接口是传统方法之一,但需注意它本身不区分深浅,具体行为由你实现决定。
贝:MemberwiseClone 是最直接的方式Object.MemberwiseClone() 是 .NET 提供的内置浅拷贝方法,它创建一个新对象,并将当前对象的字段值逐个复制过去。值类型被复制值,引用类型被复制引用(地址)。
protected 方法)示例:
class Person { public string Name; public Address Addr; }没有通用的“一键深拷贝”机制,常见可靠方式有:
System.Text.Json 或 Newtonsoft.Json 序列化再反序列化,天然实现深拷贝(前提是类型可序列化且无循环引用)[Serializable],且类型必须标记为可序列化,.NET Core/.NET 5+ 中默认禁用JSON 示例(.NET Core 3.0+):
var json = JsonSerializer.Serialize(p1);ICloneable 只定义了一个 Clone() 方法,它不指定是深还是浅——这是开发者责任。很多老代码或文档里把它等同于“浅拷贝”,但实际应以文档或实现为准。
object,调用方需强制转换,不够类型安全CloneDeep() 或构造函数传参示例(显式声明为深拷贝):
class Person : ICloneable {MemberwiseClone
JsonSerializer 深拷贝ICloneable,改用命名清晰的方法如 With(...)、DeepCopy() 或记录类型(record)的 with 表达式基本上就这些。深浅拷贝本质是对象图遍历策略的选择,关键是理解你的数据结构和共享意图,而不是迷信某个接口或方法名。