C# .net 中的浅层和深层克隆
本文关键字:net | 更新日期: 2023-09-27 17:56:26
class CloneExample : ICloneable
{
private int m_data ;
private double m_data2 ;
public object Clone()
{
return this.MemberwiseClone();
}
public CloneExample()
{
}
public CloneExample(int data1, int data2)
{
m_data = data1;
m_data2 = data2;
}
public override string ToString()
{
return String.Format("[d1,d2] {0} {1}", m_data, m_data2);
}
}
class Program
{
static void Main(string[] args)
{
CloneExample aEx = new CloneExample(10,20);
CloneExample aEx2 = (CloneExample)aEx.Clone();
Console.WriteLine("the first object value is {0}", aEx.ToString());
Console.WriteLine("the first object value is {0}", aEx2.ToString());
Console.Read();
}
}
- 我写了一个例子来了解浅层克隆是如何工作的。在上面的例子中克隆方法 我称之为。MemberWiseClone() ,因为在类中我没有实现 memeberwiseclone 。谁将提供默认实现?
Memberwiseclone 首先创建实例,可能使用 Activator.CreateInstance,然后遍历类型中的所有字段并将值设置为相应的成员/字段。
但我宁愿根本不使用ICloneable。如果我需要使用克隆,我会使用 BinaryFormatter 来序列化对象图,然后对其进行反序列化,以便获得新的深度克隆实例。
每个对象都继承自"对象",即使您没有指定。所以它就在那里。
MemberwiseClone
的默认实现来自 .NET 中的 Object 类。
MemberwiseClone 方法使用反射来完成这项工作。
这是由基对象类提供的。 在此处查看文档。