对象的“复制”,指的是把一个现有的对象“克隆(clone)”一份,得到一个新对象,这个新对象与老对象“一模一样”,但……新、老对象是完全独立的。
1. 对象的”浅复制”
使用简单的字段值拷贝方法复制一个对象,称为对象的“浅复制(shallow copy)”方式。
public static MyClass CloneObject(MyClass obj)
{
MyClass newObj = new MyClass();
newObj.MyClassValue = obj.MyClassValue; //字段复制
return newObj;
}
2. 考虑复合对象的情况
ClassA包容一个ClassB对象
基于字段值拷贝的方式复制组合对象
class ClassB
{
public int BValue = 200;
}
class ClassA
{
public int AValue = 100;
public ClassB EmbedObject; //ClassA包容一个ClassB的对象
public ClassA()
{
EmbedObject = new ClassB(); //创建被包容对象
}
public static ClassA CloneObject(ClassA obj)
{
ClassA newObj = new ClassA();
newObj.AValue = obj.AValue; //字段复制
newObj.EmbedObject = obj.EmbedObject; //引用复制
return obj;
}
}
3. 浅复制的问题
浅复制方式,无法复制出真正独立的新对象。
4. 对象的“深复制”
“深复制(Deep Copy)”在复制对象时,会把其所包容的内部对象也复制一份,并且这个过程是“递归”进行的。
5. 支持“深复制”方式的对象
.NET基类库中定义了一个ICloneable接口,所有需要实现深复制对象,应该实现这个接口
class ClassA : ICloneable
{
public int AValue = 100;
public ClassB EmbedObject; //ClassA包容一个ClassB的对象
public Object Clone()
{
ClassA ObjA = new ClassA();
ObjA.AValue = this.AValue;
ObjA.EmbedObject =
(this.EmbedObject as ICloneable).Clone() as ClassB;
return ObjA;
}
}
class ClassB : ICloneable
{
public int BValue = 200;
public Object Clone()
{
ClassB ObjB = new ClassB();
ObjB.BValue = this.BValue;
return ObjB;
}
}