14_深拷贝

深拷贝

深拷贝是一种克隆类型,其中原始对象的所有字段和属性都会被复制到克隆中,包括嵌套对象。这意味着对克隆的任何更改都不会影响原始对象。

ICloneable 接口

ICloneable 接口允许 .NET 对象创建自身的一个副本,称为克隆。克隆与原始对象具有相同的值,但它们是独立的对象。

实现 ICloneable

要实现深拷贝,可以实现 ICloneable 接口并覆盖其 Clone 方法。在 Clone 方法中,您需要手动复制原始对象的所有字段和属性。

代码示例

以下是一个简单的代码示例,演示如何使用 ICloneable 实现深拷贝:

public class Person : ICloneable
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Address Address { get; set; }

    public object Clone()
    {
        // 创建一个新对象作为克隆
        Person clone = new Person();

        // 复制基本类型字段
        clone.Name = this.Name;
        clone.Age = this.Age;

        // 复制引用类型属性
        clone.Address = (Address)this.Address.Clone();

        // 返回克隆
        return clone;
    }
}

public class Address : ICloneable
{
    public string Street { get; set; }
    public string City { get; set; }

    public object Clone()
    {
        // 创建一个新对象作为克隆
        Address clone = new Address();

        // 复制基本类型字段
        clone.Street = this.Street;
        clone.City = this.City;

        // 返回克隆
        return clone;
    }
}

// 使用 Person 对象
Person person1 = new Person
{
    Name = "John Doe",
    Age = 30,
    Address = new Address { Street = "123 Main Street", City = "Anytown" }
};

// 克隆 person1
Person person2 = (Person)person1.Clone();

// 修改克隆
person2.Name = "Jane Doe";
person2.Address.Street = "456 Elm Street";

// 输出结果
Console.WriteLine($"Original Person: {person1.Name}, {person1.Age}, {person1.Address.Street}, {person1.Address.City}");
Console.WriteLine($"Cloned Person: {person2.Name}, {person2.Age}, {person2.Address.Street}, {person2.Address.City}");

输出:

Original Person: John Doe, 30, 123 Main Street, Anytown
Cloned Person: Jane Doe, 30, 456 Elm Street, Anytown
posted @ 2024-03-04 23:18  甜饼怪2030  阅读(39)  评论(0)    收藏  举报