问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C#浅拷贝与深拷贝区别

发布网友 发布时间:2022-04-21 07:45

我来回答

3个回答

热心网友 时间:2022-05-16 07:46

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

 
         }

     }
 }

热心网友 时间:2022-05-16 09:04

深拷贝是对象里面关联的对象也会被拷贝

热心网友 时间:2022-05-16 10:39

关键在类对象内的引用,浅拷贝保持引用类对象内的引用,深拷贝连引用对象一起拷贝。
比如有一个School类,里边有SchoolName学校名称,还有teacher对象。
浅拷贝只拷贝SchoolName,teacher还是之前的引用对象(此时拷贝对象修改teacher值会影响老对象的teacher值)。深拷贝连teacher也拷贝,这样新的对象和之前的对象完全复制,修改teacher值不会影响老对象的teacher值。
深拷贝和浅拷贝的区别是什么?

深拷贝和浅拷贝的区别如下:浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址。深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。Python的语句:不同于C+ +等...

如何把doc文件转换成PDF格式?

"1.当然可以,首先要确定自己有一个pdf文档,而且确定目的是需要将pdf文档转换为word格式,然后我们将现有文档通过迅捷pdf转换器软件打开。2.通过选择PDF转换页面功能其中的PDF文件转WORD项目拖入文件。3.接着在迅捷pdf转换器下方按自己的需要是否更改文件名,然而在保存类型中选择*.doc选项。4.全部设置完成点击开始转换,确定自己设置好路径、更改文件名和保存类型即可。5.转换完成之后的word文档同样可以通过迅捷pdf转换器重新转换成一开始的pdf文档。"1.当然可以,首先要确定自己有一个pdf文档,而且确定目的是需要将pdf文档转换为word格式,然后我们将现有文档通过迅捷pdf转换器软件打开。2.通过选择PDF转换页面功能其中的PDF文件转WORD项目拖入文件。3.接着在迅捷pdf转换器下方按自己的需要是...

浅拷贝与深拷贝的区别

具体来说,两者的主要区别在于如何处理对象的属性:浅拷贝复制的是对象的引用而非实际数据,而深拷贝则完全复制了对象的所有层级,包括嵌套的对象和数组。因此,在修改或更改复制的对象时,浅拷贝会存在影响原始对象的风险,而深拷贝创建的对象则是完全独立的副本。在实际应用中,选择使用浅拷贝还是深拷贝取...

深拷贝与浅拷贝的区别,实现深拷贝的几种方法

深拷贝与浅拷贝的区别在于,对原始对象的修改是否影响副本。深拷贝会独立复制对象,而浅拷贝则仅复制引用。本文将介绍如何区分和实现深拷贝。在编程中,理解基本数据类型(如number、string等)与引用数据类型(如对象、数组)的差异至关重要。基本数据类型直接存储值,而引用类型存储的是对内存地址的引用。...

深拷贝和浅拷贝的区别

1、浅拷贝 浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存 2、深拷贝 深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。二、方法 1、浅拷贝 a、Object.assign()Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝...

python深拷贝和浅拷贝的区别

所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。深拷贝只有一种方式:copy模块中的deepcopy函数。总结:copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变 深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会...

什么是深拷贝和浅拷贝

浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于JavaScript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个...

深拷贝和浅拷贝的区别?

1、浅拷贝可以使用列表自带的copy()函数(如list.copy()),或者使用copy模块的copy()函数。深拷贝只能使用copy模块的deepcopy(),所以使用前要导入:from copy import deepcopy。2、 如果拷贝的对象里的元素只有值,没有引用,那浅拷贝和深拷贝没有差别,都会将原有对象复制一份,产生一个新对象,对...

深拷贝、浅拷贝的理解与使用场景

区别点:深拷贝会创建一个新的内存空间,拷贝的值是一样的,但是内存地址不一样。浅拷贝只是拷贝指向原来对象的地址,使原对象的引用计数+1 像NSString、NSNumber这些不能包含其他对象的叫做非容器类对象 像NSArray、NSDictionary这些可以包含其他对象的叫容器类对象 打印结果如下:通过对比不难发现:上面...

浅拷贝与深拷贝的区别

简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!我列举一个例子来说吧:你正在编写C++程序中有时...

什么是深拷贝和浅拷贝

浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象...

简述深拷贝与浅拷贝的联系与区别 浅拷贝和深拷贝区别与缺点 c深拷贝和浅拷贝的区别 js深拷贝和浅拷贝的区别 对象的深拷贝和浅拷贝的区别是什么 赋值浅拷贝深拷贝的区别 数组浅拷贝和深拷贝的区别 Java浅拷贝和深拷贝的区别 python深拷贝和浅拷贝的区别
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
肾结石对肾功能有什么影响 肾结石会影响肾功能吗 肾结石有后遗症吗 肾结石有什么影响 龚琳娜大事年表 龚琳娜音乐作品 龚琳娜的歌(全部) ...她说做不了好朋友,还可以做朋友,是什么意思啊!以后还 ..._百度... ...Out )攻略_荒野行动卡在登陆界面怎么办 卡屏解决方法 “柳色和愁为重折”的出处是哪里 java深拷贝和浅拷贝的区别 什么是浅拷贝(shallow copy)和深拷贝(deep copy) 转:C#之深拷贝和浅拷贝的区别 求助深拷贝和浅拷贝的问题 深拷贝和浅拷贝怎样理解(通俗具体点儿) 什么是深拷贝和浅拷贝 浅拷贝与深拷贝的区别 阳光融和医院是阳光保险的吗? 阳光融和医院做的好么? 阳光融和医院跟阳光保险有关系吗? 山东阳光融和医院有限责任公司怎么样? 阳光保险的阳光融和医院获得国际JCI认证了吗? 阳光融和医院是阳光保险建的吗? 听说阳光融和医院是阳光保险近年成立的? 听说阳光融和医院是阳光保险创办的? 听说阳光融和医院是阳光保险做的? 阳光保险创办阳光融和医院了吗? 听说阳光融和医院是阳光保险创办的?是这样的吗 潍坊阳光融合医院招聘吗 是阳光保险成立的阳光融和医院么? net中浅拷贝和深拷贝有什么区别,分别如何实现 js深拷贝和浅拷贝的区别 JAVA 中浅拷贝与深拷贝有什么区别? 深拷贝和浅拷贝的区别 新房装修卫生间用蹲坑好还是马桶好 卫生间装马桶好还是蹲便好,看完这些之后再也不用纠结 卫生间是装马桶还是装蹲便器好 卫生间到底装马桶好还是蹲厕好? 卫生间在装修的时候,安装马桶比较好还是蹲坑比较好? 经验,卫生间到底装马桶好还是蹲坑好 卫生间装蹲便器好还是马桶好? 蹲坑和马桶,你家卫生间装修选择哪个 卫生间装修选蹲便器好还是马桶好 卫生间到底装蹲坑还是马桶好,家用马桶和蹲坑哪个好 新房装修卫生间装马桶好还是蹲坑好 卫生间装马桶好还是蹲坑好?聪明人这么选,水费至少省一半! 卫生间装蹲便器好还是马桶好 客卫用马桶还是蹲坑好 一个卫生间可否同时装坐便器和蹲便器呢? 高层住宅卫生间装坐便器还是蹲便器好