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()
是否会创建新对象然后复制?
答案 0 :(得分:1)
撰写b = a
更改b
以引用a
引用的相同对象。
请注意,这仅适用于类;如果a
和b
是结构,则会复制该值。
MemberwiseClone
方法返回一个新对象,并指定新对象中的所有字段以引用原始对象中的值。
这是一个浅薄的副本。
答案 1 :(得分:0)
来自MSDN:
MemberwiseClone方法创建一个 通过创建新对象进行浅层复制, 然后然后复制非静态字段 当前对象对新的 宾语。如果字段是值类型,则a 该字段的逐位副本是 执行。如果字段是引用 类型,引用被复制但是 被引物体不是;因此, 原始对象及其克隆参考 同一个对象。
MemberwiseClone()
会创建一个浅表副本,但这与您在此处执行的任务无关:
Test a = new Test();
Test b = a;
对象引用(a和b)现在都指向相同的对象。如果您需要MemberwiseClone()
,则必须直接调用它,就像使用Clone()
方法一样。