C#面向对象基础(一)【对象操作之对象复制】
对象的“复制”,指的是把一个现有的对象“克隆(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;
- }
- }
0条评论