c# 深拷贝与浅拷贝

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

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

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

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

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

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

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 
  5 namespace WindowsApplication1
  6 {
  7     class Program
  8     {
  9         public class Sex
 10         {
 11             private string _PSex;
 12             public string PSex
 13             {
 14                 set
 15                 {
 16                     _PSex = value;
 17                 }
 18                 get
 19                 {
 20                     return _PSex;
 21                 }
 22             }
 23 
 24         }
 25 
 26         public class Person : ICloneable
 27         {
 28             
 29             private Sex _pSex = new Sex();
 30             public int aa = 1213;
 31 
 32             public string pSex
 33             {
 34                 set
 35                 {
 36                     _pSex.PSex = value;
 37                 }
 38                 get
 39                 {
 40                     return _pSex.PSex;
 41                 }
 42             }
 43             private string _PName;
 44             public string PName
 45             {
 46                 set
 47                 {
 48                     this._PName = value;
 49                 }
 50                 get
 51                 {
 52                     return this._PName;
 53                 }
 54             }
 55 
 56             public void ShowPersonInfo()
 57             {
 58                 Console.WriteLine("-------------------------");
 59                 Console.WriteLine("Name:{0} Sex:{1}", _PName, this.pSex);
 60                 Console.WriteLine("-------------------------");
 61                 Console.WriteLine(this.aa);
 62             }
 63             //浅拷贝
 64             public object Clone()
 65             {
 66                 return this.MemberwiseClone();
 67             }
 68             //深拷贝
 69             public object DeepClone()
 70             {
 71                 Person newP = new Person();
 72                 newP.PName = this._PName;
 73                 newP.pSex = this.pSex;
 74                 return newP;
 75             }
 76 
 77         }
 78 
 79         static void Main(string[] args)
 80         {
 81             Console.WriteLine("原对象:");
 82             Person p = new Person();
 83             p.PName = "JackLee";
 84             p.pSex = "";
 85            
 86             p.ShowPersonInfo();
 87 
 88 
 89             //浅拷贝        
 90             Person copy = (Person)p.Clone();
 91             //深拷贝
 92             Person dcopy = (Person)p.DeepClone();
 93 
 94 
 95             Console.WriteLine("修改后的原对象:");
 96             p.PName = "JackZhao";
 97             p.pSex = "";
 98             p.aa = 1111;
 99             p.ShowPersonInfo();
100 
101 
102             Console.WriteLine("修改后的浅拷贝对象:");
103             copy.ShowPersonInfo();
104             Console.WriteLine("修改后的深拷贝对象:");
105             dcopy.ShowPersonInfo();
106 
107             Console.WriteLine("直接拷贝对象:");
108             Person PP = p;
109             PP.ShowPersonInfo();
110 
111             Console.ReadLine();
112 
113 
114         }
115 
116     }
117 }

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

原文地址:https://www.cnblogs.com/learnyou/p/2975279.html