C#.net中的浅层和深层克隆

时间:2011-05-12 09:34:15

标签: c#

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();

    }
}
  1. 我写了一个例子,了解浅层克隆是如何工作的。在上面的例子中 clone方法我调用this.MemberWiseClone(),因为在类中我还没有实现memeberwiseclone。谁将提供默认实现?

4 个答案:

答案 0 :(得分:5)

Memberwiseclone 首先使用 Activator.CreateInstance 创建实例,然后迭代该类型中的所有字段并将值设置为相应的成员/字段。

但我宁愿根本不使用ICloneable。如果我需要使用克隆,我使用BinaryFormatter序列化对象图,然后反序列化它,以便我得到新的深度克隆的实例。

答案 1 :(得分:1)

即使您未指定,每个对象都继承自“对象”。 所以它是there

答案 2 :(得分:1)

MemberwiseClone的默认实现来自.NET中的Object类。

MemberwiseClone方法使用反射来完成工作。

答案 3 :(得分:0)

这是由基类Object提供的。查看文档here