在 C# 里,实现深拷贝有多种常见方法,下面为你详细介绍。
手动实现深拷贝
手动实现深拷贝需要为类创建一个方法,该方法会递归地复制对象及其所有子对象。以下是一个示例:
using System;
class Address
{
public string Street { get; set; }
public string City { get; set; }
public Address(string street, string city)
{
Street = street;
City = city;
}
public Address DeepCopy()
{
return new Address(Street, City);
}
}
class Person
{
public string Name { get; set; }
public Address Address { get; set; }
public Person(string name, Address address)
{
Name = name;
Address = address;
}
public Person DeepCopy()
{
return new Person(Name, Address.DeepCopy());
}
}
class Program
{
static void Main()
{
Address originalAddress = new Address("123 Main St", "Anytown");
Person originalPerson = new Person("John Doe", originalAddress);
Person copiedPerson = originalPerson.DeepCopy();
// 修改复制对象的地址
copiedPerson.Address.Street = "456 Elm St";
Console.WriteLine(originalPerson.Address.Street); // 输出: 123 Main St
Console.WriteLine(copiedPerson.Address.Street); // 输出: 456 Elm St
}
}
在这个示例中,Address 类和 Person 类都有一个 DeepCopy 方法,用于创建对象的深拷贝。
利用序列化和反序列化实现深拷贝
借助 BinaryFormatter 或 JsonSerializer 进行序列化和反序列化操作,也能够实现深拷贝。以下是使用 JsonSerializer 的示例:
using System;
using System.Text.Json;
class Address
{
public string Street { get; set; }
public string City { get; set; }
}
class Person
{
public string Name { get; set; }
public Address Address { get; set; }
}
class Program
{
static T DeepCopy<T>(T obj)
{
string json = JsonSerializer.Serialize(obj);
return JsonSerializer.Deserialize<T>(json);
}
static void Main()
{
Address originalAddress = new Address { Street = "123 Main St", City = "Anytown" };
Person originalPerson = new Person { Name = "John Doe", Address = originalAddress };
Person copiedPerson = DeepCopy(originalPerson);
// 修改复制对象的地址
copiedPerson.Address.Street = "456 Elm St";
Console.WriteLine(originalPerson.Address.Street); // 输出: 123 Main St
Console.WriteLine(copiedPerson.Address.Street); // 输出: 456 Elm St
}
}
在这个示例中,DeepCopy 方法将对象序列化为 JSON 字符串,再将其反序列化为新对象,从而实现深拷贝。
总结
- 手动实现:适用于对象结构简单、类的层次较浅的情况,代码可读性高,但当对象结构复杂时,手动实现会比较繁琐。
- 序列化和反序列化:能处理复杂的对象结构,不过性能相对较低,并且在使用
BinaryFormatter时存在安全风险,建议优先使用JsonSerializer。

被折叠的 条评论
为什么被折叠?



