对象克隆-CloneUtil
# EasyTool.CloneUtil 类
静态工具类 CloneUtil,用于深度克隆对象
# Clone-深度克隆给定对象
public static T Clone<T>(T obj)
- 参数
参数 | 类型 | 描述 |
---|---|---|
obj | T | 要克隆的对象。 |
- 返回值
克隆出的对象。
- 异常
ArgumentException
:如果对象类型不可序列化,则引发异常。
- 示例
var original = new MyClass { /* initialize properties */ };
var clone = CloneHelper.Clone(original);
- 命名空间
EasyTool
- 参考
# 核心概念
# 浅克隆
笔记
浅克隆是指仅复制对象中的值类型成员和引用类型成员的引用。这意味着克隆后的对象和原始对象共享同一个引用类型成员,如果修改其中一个对象的引用类型成员,另一个对象的引用类型成员也会受到影响。
下面是一个示例代码,展示了如何实现浅克隆:
public class Person
{
public string Name { get; set; }
public Address Address { get; set; }
public Person Clone()
{
return (Person)this.MemberwiseClone();
}
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
}
// 使用示例
var person1 = new Person
{
Name = "John",
Address = new Address
{
Street = "123 Main St",
City = "Anytown",
State = "CA"
}
};
var person2 = person1.Clone();
person2.Name = "Jane";
person2.Address.Street = "456 Elm St";
Console.WriteLine(person1.Name); // Output: John
Console.WriteLine(person1.Address.Street); // Output: 456 Elm St
在上面的代码中,Person
类包含一个引用类型成员 Address
,它实现了 Clone
方法以实现浅克隆。在使用示例中,我们先克隆 person1
,然后修改克隆出来的 person2
的 Name
和 Address.Street
属性。在输出结果中,我们可以看到 person1.Address.Street
的值也被修改了,这是因为 person1
和 person2
共享同一个 Address
对象。
# 深克隆
笔记
深克隆是指复制对象中所有的值类型成员和引用类型成员,不共享任何引用类型成员。这意味着克隆后的对象和原始对象是完全独立的。
下面是一个示例代码,展示了如何实现深克隆:
public class Person
{
public string Name { get; set; }
public Address Address { get; set; }
public Person Clone()
{
var clonedAddress = new Address
{
Street = this.Address.Street,
City = this.Address.City,
State = this.Address.State
};
return new Person
{
Name = this.Name,
Address = clonedAddress
};
}
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
}
// 使用示例
var person1 = new Person
{
Name = "John",
Address = new Address
{
Street = "123 Main St",
City = "Anytown",
State = "CA"
}
};
var person2 = person1.Clone();
person2.Name = "Jane";
person2.Address.Street = "456 Elm";
Console.WriteLine(person1.Name); // Output: John
Console.WriteLine(person1.Address.Street); // Output: 123 Main St
在上面的代码中,Person
类包含一个引用类型成员 Address
,它实现了 Clone
方法以实现深克隆。在使用示例中,我们先克隆 person1
,然后修改克隆出来的 person2
的 Name
和 Address.Street
属性。在输出结果中,我们可以看到 person1.Address.Street
的值没有被修改,这是因为 person1
和 person2
拥有独立的 Address
对象。
# 总结
浅克隆和深克隆是在对象克隆中常用的两种方式。浅克隆可以通过 MemberwiseClone 方法实现,它只复制值类型成员和引用类型成员的引用。深克隆需要开发人员手动实现,它复制对象中所有的值类型成员和引用类型成员,不共享任何引用类型成员。在选择克隆方式时,需要根据实际情况进行权衡。