使用Memberwiseclone()方法进行浅复制

时间:2011-03-10 18:49:58

标签: c#

class Test:ICloneable
{
    int a;

    Test()
    {  
        a = 20;
    }

    public int Data
    {
        set
        {
            a= value;
        }
    }

    object Clone()
    {
        this.MemeberWiseClone();
    }
}

Test a = new Test();
Test b = a;

现在,如果我们修改数据a,b也会改变

问题1:

当调用发生哪个函数被调用时,System.object的MemberwiseClone()被称为

问题2:

Test a = new Test();
Test b = (Test) a.Clone();

如果你改变a的数据,b不会改变,那是因为浅拷贝。

MemberwiseClone()是否会创建新对象然后复制?

2 个答案:

答案 0 :(得分:1)

撰写b = a更改b以引用a引用的相同对象。
请注意,这仅适用于类;如果ab是结构,则会复制该值。

MemberwiseClone方法返回一个新对象,并指定新对象中的所有字段以引用原始对象中的值。
这是一个浅薄的副本。

答案 1 :(得分:0)

来自MSDN

  

MemberwiseClone方法创建一个   通过创建新对象进行浅层复制,   然后然后复制非静态字段   当前对象对新的   宾语。如果字段是值类型,则a   该字段的逐位副本是   执行。如果字段是引用   类型,引用被复制但是   被引物体不是;因此,   原始对象及其克隆参考   同一个对象。

MemberwiseClone()会创建一个浅表副本,但这与您在此处执行的任务无关:

Test a = new Test();
Test b = a;

对象引用(a和b)现在都指向相同的对象。如果您需要MemberwiseClone(),则必须直接调用它,就像使用Clone()方法一样。