深拷贝和浅拷贝
.net的引用类型相互赋值是使他们的引用指向同一个堆栈。如:Object A=new Object(); Object B=A;这是A和B的引用时指向同一个堆地址的。如果我们想实现在堆上分配相同结构的堆,但是地址不同,这就需要借助到浅拷贝和深拷贝了。
浅拷贝通过object的MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
public object NoDeepClone()
{
ClassA classA = (ClassA)this.MemberwiseClone();
return classA;
}
{
ClassA classA = (ClassA)this.MemberwiseClone();
return classA;
}
而深拷贝是要通过继承实现ICloneable接口来实现的。
public class ClassA:ICloneable
{
public int AValue { get; set; }
public ClassB ClassBValue { get; set; }
public object Clone()
{
ClassA classA = new ClassA();
classA.AValue = this.AValue;
classA.ClassBValue = (ClassB)this.ClassBValue.Clone();
return classA;
}
}
public class ClassB: ICloneable
{
public int BValue { get; set; }
public object Clone()
{
ClassB classB = new ClassB();
classB.BValue = this.BValue;
return classB;
}
}
{
public int AValue { get; set; }
public ClassB ClassBValue { get; set; }
public object Clone()
{
ClassA classA = new ClassA();
classA.AValue = this.AValue;
classA.ClassBValue = (ClassB)this.ClassBValue.Clone();
return classA;
}
}
public class ClassB: ICloneable
{
public int BValue { get; set; }
public object Clone()
{
ClassB classB = new ClassB();
classB.BValue = this.BValue;
return classB;
}
}
注意:
1.对于深拷贝,要求所参与的类都必须实现ICloneable接口,或者有提供实现复制自己的共有方法。
2.要注意深拷贝中的循环包含问题。