欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c# 深拷贝与浅拷贝的区别分析及实例

程序员文章站 2023-12-09 18:00:57
      深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张...

      深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是value(值)对象,如预定义类型int32,double,以及结构(struct),枚举(enum)等。

      浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。

      c#中有两种类型变量,一种 是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此 对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现icloneable接口中提供的clone方法。

看看定义:
      浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
      深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

浅拷贝和深拷贝的区别
      浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一 个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对 象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。

下面通过实例可以清楚看到浅拷贝与深拷贝的区别,代码如下:

复制代码 代码如下:

using system;
 using system.collections.generic;
 using system.text;

 namespace windowsapplication1
 {
     class program
     {
         public class sex
         {
             private string _psex;
             public string psex
             {
                 set
                 {
                     _psex = value;
                 }
                 get
                 {
                     return _psex;
                 }
             }

         }

         public class person : icloneable
         {

             private sex _psex = new sex();
             public int aa = 1213;

             public string psex
             {
                 set
                 {
                     _psex.psex = value;
                 }
                 get
                 {
                     return _psex.psex;
                 }
             }
             private string _pname;
             public string pname
             {
                 set
                 {
                     this._pname = value;
                 }
                 get
                 {
                     return this._pname;
                 }
             }

             public void showpersoninfo()
             {
                 console.writeline("-------------------------");
                 console.writeline("name:{0} sex:{1}", _pname, this.psex);
                 console.writeline("-------------------------");
                 console.writeline(this.aa);
             }
             //浅拷贝
             public object clone()
             {
                 return this.memberwiseclone();
             }
             //深拷贝
             public object deepclone()
             {
                 person newp = new person();
                 newp.pname = this._pname;
                 newp.psex = this.psex;
                 return newp;
             }

         }

         static void main(string[] args)
         {
             console.writeline("原对象:");
             person p = new person();
             p.pname = "jacklee";
             p.psex = "男";

             p.showpersoninfo();

 
             //浅拷贝       
             person copy = (person)p.clone();
             //深拷贝
             person dcopy = (person)p.deepclone();

 
             console.writeline("修改后的原对象:");
             p.pname = "jackzhao";
             p.psex = "女";
             p.aa = 1111;
             p.showpersoninfo();

 
             console.writeline("修改后的浅拷贝对象:");
             copy.showpersoninfo();
             console.writeline("修改后的深拷贝对象:");
             dcopy.showpersoninfo();

             console.writeline("直接拷贝对象:");
             person pp = p;
             pp.showpersoninfo();

             console.readline();

 
         }

     }
 }

好了,关于深拷贝与浅拷贝就说到这里,项目还没完事,先抓紧了。代码可以直接复制到项目中运行。