C#面向对象基础(一)【对象操作之对象复制】

C#面向对象基础(一)【对象操作之对象复制】,第1张

对象的“复制”,指的是把一个现有的对象“克隆(clone)”一份,得到一个新对象,这个新对象与老对象“一模一样”,但……新、老对象是完全独立的。

1. 对象的”浅复制”

C#面向对象基础(一)【对象操作之对象复制】,第2张

使用简单的字段值拷贝方法复制一个对象,称为对象的“浅复制(shallow copy)”方式。

C#面向对象基础(一)【对象操作之对象复制】,第3张

  1. public static MyClass CloneObject(MyClass obj)
  2. {
  3. MyClass newObj = new MyClass();
  4. newObj.MyClassValue = obj.MyClassValue; //字段复制
  5. return newObj;
  6. }

2. 考虑复合对象的情况

 ClassA包容一个ClassB对象

基于字段值拷贝的方式复制组合对象

  1. class ClassB
  2. {
  3. public int BValue = 200;
  4. }
  5. class ClassA
  6. {
  7. public int AValue = 100;
  8. public ClassB EmbedObject; //ClassA包容一个ClassB的对象
  9. public ClassA()
  10. {
  11. EmbedObject = new ClassB(); //创建被包容对象
  12. }
  13. public static ClassA CloneObject(ClassA obj)
  14. {
  15. ClassA newObj = new ClassA();
  16. newObj.AValue = obj.AValue; //字段复制
  17. newObj.EmbedObject = obj.EmbedObject; //引用复制
  18. return obj;
  19. }
  20. }

3. 浅复制的问题 

浅复制方式,无法复制出真正独立的新对象。

C#面向对象基础(一)【对象操作之对象复制】,第4张

4. 对象的“深复制”

“深复制(Deep Copy)”在复制对象时,会把其所包容的内部对象也复制一份,并且这个过程是“递归”进行的。

C#面向对象基础(一)【对象操作之对象复制】,第5张

5. 支持“深复制”方式的对象

.NET基类库中定义了一个ICloneable接口,所有需要实现深复制对象,应该实现这个接口

  1. class ClassA : ICloneable
  2. {
  3. public int AValue = 100;
  4. public ClassB EmbedObject; //ClassA包容一个ClassB的对象
  5. public Object Clone()
  6. {
  7. ClassA ObjA = new ClassA();
  8. ObjA.AValue = this.AValue;
  9. ObjA.EmbedObject =
  10. (this.EmbedObject as ICloneable).Clone() as ClassB;
  11. return ObjA;
  12. }

  13. }

  14. class ClassB : ICloneable
  15. {
  16. public int BValue = 200;
  17. public Object Clone()
  18. {
  19. ClassB ObjB = new ClassB();
  20. ObjB.BValue = this.BValue;
  21. return ObjB;
  22. }
  23. }
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C#面向对象基础(一)【对象操作之对象复制】

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情