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 @   甜饼怪2030  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示