对象克隆为了复制某个对象的内容,生成一个新的对象,而非把一个对象赋值给另一个对象(这样的话得到的是其引用值,说白了就是对象的另一个名称)。
class Test{
public int Att1;
public string Att2;
}
Test obj1 = new Test();
Test obj2 = obj1;
obj2.Att1 = 1;
obj2.Att2 = "abc";
用上面的例子来说,如果改变obj2的属性值,那么obj1的属性值也会发生变化。结果obj1.Att1=1,obj1.Att2="abc"。
由于对象是引用类型,所以克隆对象为了生成一个新的复制品而脱离与原对象的关系。一般分成浅克隆和深克隆。
浅克隆
浅克隆只复制对象内的值类型的属性,对于引用类型的属性只是复制了原对象该属性的引用(仍然保持与原对象属性的关系)。
class Test{
public int Att1;
public string Att2;
public object CloneThis()
{
return this.MemberwiseClone();
}
}
Test obj1 = new Test();
Test obj2 = obj1.CloneThis();
obj2.Att1 = 1;
obj2.Att2 = "abc";
上面例子的结果,obj1.Att1的值不变,obj1.Att2="abc"。
深克隆
深克隆完全复制对象的属性。需要编写代码把属性复制。
class Test{
public int Att1;
public string Att2;
private Test(Test t){
this.Att1 = t.Att1;
this.Att2 = (string)(t.Att2.Clone());
}
public object CloneThis()
{
return new Test(this);
}
}
Test obj1 = new Test();
Test obj2 = obj1.CloneThis();
obj2.Att1 = 1;
obj2.Att2 = "abc";
上面例子的结果,obj1的属性值就不会跟着obj2变化了。