深拷贝
深拷贝是一种克隆类型,其中原始对象的所有字段和属性都会被复制到克隆中,包括嵌套对象。这意味着对克隆的任何更改都不会影响原始对象。
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
标签:克隆,clone,Person,Street,Address,拷贝,public,14
From: https://www.cnblogs.com/cookie2030/p/18053000