• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

c# 搞代码 4年前 (2022-01-09) 11次浏览 已收录 0个评论

深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是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 pS<i>本文来源gaodai$ma#com搞$代*码*网</i>ex             {                 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();          }     } }

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

更多c# 深拷贝与浅拷贝的区别分析及实例相关文章请关注搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:c# 深拷贝与浅拷贝的区别分析及实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址