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