深拷贝和浅拷贝

     .net的引用类型相互赋值是使他们的引用指向同一个堆栈。如:Object A=new Object(); Object B=A;这是A和B的引用时指向同一个堆地址的。如果我们想实现在堆上分配相同结构的堆,但是地址不同,这就需要借助到浅拷贝和深拷贝了。

     浅拷贝通过object的MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

public object NoDeepClone()
{
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;
}
}

注意:

       1.对于深拷贝,要求所参与的类都必须实现ICloneable接口,或者有提供实现复制自己的共有方法。

        2.要注意深拷贝中的循环包含问题。

posted @ 2011-03-09 22:10  雁北飞  阅读(176)  评论(0编辑  收藏  举报