整理对象克隆

Posted on 2009-01-06 11:59  名号M  阅读(286)  评论(0编辑  收藏  举报

     对象克隆为了复制某个对象的内容,生成一个新的对象,而非把一个对象赋值给另一个对象(这样的话得到的是其引用值,说白了就是对象的另一个名称)。

     class Test{

          public int Att1;

          public string Att2;

     }

     Test obj1 = new Test();

     Test obj2 = obj1;

     obj2.Att1 = 1;

     obj2.Att2 = "abc";

     用上面的例子来说,如果改变obj2的属性值,那么obj1的属性值也会发生变化。结果obj1.Att1=1,obj1.Att2="abc"。

 

     由于对象是引用类型,所以克隆对象为了生成一个新的复制品而脱离与原对象的关系。一般分成浅克隆和深克隆。

     浅克隆

     浅克隆只复制对象内的值类型的属性,对于引用类型的属性只是复制了原对象该属性的引用(仍然保持与原对象属性的关系)。

    class Test{

          public int Att1;

          public string Att2;

          public object CloneThis()
          {
               return this.MemberwiseClone();
          }

     }

     Test obj1 = new Test();

     Test obj2 = obj1.CloneThis();

     obj2.Att1 = 1;

     obj2.Att2 = "abc";

     上面例子的结果,obj1.Att1的值不变,obj1.Att2="abc"。

     深克隆

     深克隆完全复制对象的属性。需要编写代码把属性复制。

 

    class Test{

          public int Att1;

          public string Att2;

          private  Test(Test t){

               this.Att1 = t.Att1;

               this.Att2 = (string)(t.Att2.Clone());

          }

          public object CloneThis()
          {
               return new Test(this);

          }

     }

     Test obj1 = new Test();

     Test obj2 = obj1.CloneThis();

     obj2.Att1 = 1;

     obj2.Att2 = "abc";

     上面例子的结果,obj1的属性值就不会跟着obj2变化了。

Copyright © 2024 名号M
Powered by .NET 8.0 on Kubernetes