C#中实现深拷贝

在 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 方法,用于创建对象的深拷贝。

利用序列化和反序列化实现深拷贝

借助 BinaryFormatterJsonSerializer 进行序列化和反序列化操作,也能够实现深拷贝。以下是使用 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gene Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值