转自:http://www.cnblogs.com/phoenix-rock/archive/2006/11/07/shallowcopy_deepcopy.html

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

考虑以下写法

int source = int.MaxValue;//(1)初始化源对象为整数的最大值2,147,483,647

int dest = source;//(2)赋值,内部执行深拷贝

dest = 1024;//(3)对拷贝对象进行赋值

source = 2048;//(4)对源对象进行赋值

首先(2)中将source赋给dest,执行了深拷贝动作,其时dest和source的值是一样的,都是int.MaxValue;(3)对dest进行修改,dest值变为1024,由于是深拷贝,因此不会运行source,source仍然是int.MaxValue;(4)对source进行了修改,同样道理,dest仍然是1024,同时int.MaxValue的值也不变,仍然是2,147,483,647;只有source变成了2048。

再考虑以下写法

struct Point

{

public int X;

public int Y;

public Point(int x, int y)

{

X = x;

Y = y;

}

}

Point source = new Point(10, 20);

Point dest = source;

dest.X = 20

当dest.X属性变成20后,source的X属性仍然是10

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

考虑以下写法

class Point

{

public int X;

public int Y;

public Point(int x, int y)

{

X = x;

Y = y;

}

}

Point source = new Point(10, 20);

Point dest = source;

dest.X = 20;

由于Point现在是引用对象,因此Point dest=source的赋值动作实际上执行的是浅拷贝,最后的结果应该是source的X字段值也变成了20。即它们引用了同一个对象,仅仅是变量明source和dest不同而已。

  1. 引用对象的浅拷贝原理

引用对象之间的赋值之所以执行的是浅拷贝动作,与引用对象的特性有关,一个引用对象一般来说由两个部分组成

(1)一个具名的Handle,也就是我们所说的声明(如变量)

(2)一个内部(不具名)的对象,也就是具名Handle的内部对象。它在Manged Heap(托管堆)中分配,一般由新增引用对象的New方法是进行创建

如果这个内部对象已被创建,那么具名的Handle就指向这个内部对象在Manged Heap中的地址,否则就是null(从某个方面来讲,如果这个具名的handle可以被赋值为null,说明这是一个引用对象,当然不是绝对)。两个引用对象如果进行赋值,它们仅仅是复制这个内部对象的地址,内部对象仍然是同一个,因此,源对象或拷贝对象的修改都会影响对方。这也就是浅拷贝

  1. 引用对象如何进行深拷贝

由于引用对象的赋值仅仅是复制具名Handle(变量)指向的地址,因此要对引用对象进行深拷贝就要重新创建一份该对象的实例,并对该对象的字段进行逐一赋值,如以下写法

class Point

{

public int X;

public int Y;

public Point(int x, int y)

{

X = x;

Y = y;

}

}

Point source = new Point(10, 20);

Point dest = new Point(source.X, source.Y);

//或以下写法

//Point dest = new Point()

//dest.X = source.X

//dest.Y = source.Y

其时,source和dest就是两个互相独立的对象了,两者的修改都不会影响对方

5.一些需要注意的东西

(1):String字符串对象是引用对象,但是很特殊,它表现的如值对象一样,即对它进行赋值,分割,合并,并不是对原有的字符串进行操作,而是返回一个新的字符串对象

(2):Array数组对象是引用对象,在进行赋值的时候,实际上返回的是源对象的另一份引用而已;因此如果要对数组对象进行真正的复制(深拷贝),那么需要新建一份数组对象,然后将源数组的值逐一拷贝到目的对象中

转载于:https://www.cnblogs.com/h20064528/archive/2012/04/23/2466624.html

【转】C#对象的深拷贝与浅拷贝相关推荐

  1. python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  2. Python基础:对象的深拷贝和浅拷贝的区别

    Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...

  3. java 复制Map对象(深拷贝与浅拷贝)

    java 复制Map对象(深拷贝与浅拷贝) CreationTime--2018年6月4日10点00分 Author:Marydon 1.深拷贝与浅拷贝 浅拷贝:只复制对象的引用,两个引用仍然指向同一 ...

  4. 一文搞懂前端对象的深拷贝与浅拷贝

    在前端开发过程中常常会听到对象的深拷贝与浅拷贝,对于初学者来说,可能是傻傻的分不清楚,本人将详细介绍javascript中对象的深拷贝与浅拷贝. 一.javascript中的数据类型 基础数据类型 字 ...

  5. 浅谈对象的深拷贝和浅拷贝

    浅谈对象的深拷贝和浅拷贝 一.为什么使用对象的拷贝? 1.在普通数据类型赋值 let a=10let b=aa=20console.log(a)//a=20console.log(a)//b=10 因 ...

  6. PHP中对象的深拷贝与浅拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 最近写了一个php脚本,在脚本中使用到了SplPriorityQueue,会用到两次 因此写了如下: $res=$tmp_re ...

  7. vue对象深拷贝_JS 对象的深拷贝和浅拷贝

    现象 我们先来看一个demo // 我们先申明一个变量str1, // 然后把变量str1负值(拷贝)给变量str2 // 最后对变量str2进行修改操作 var str1 = 'shen' var ...

  8. python 实例对象 浅拷贝_Python 对象的深拷贝与浅拷贝 -- (转)

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  9. Js中对象的深拷贝和浅拷贝

    浅拷贝:只拷贝对象的基础属性值,对属性值为对象或数组的属性则拷贝指针.  深拷贝:拷贝对象的所有属性作为一个全新的对象.拷贝前后的对象互不影响. 浅拷贝仅仅是指向被复制的内存地址,如果原地址中对象被改 ...

最新文章

  1. ALDownloadManager 基于Alamofire封装的下载器
  2. vivo手机解锁_vivo“手术刀”再营业,OriginOS让手机做“减法”
  3. 简单易学的深度学习算法:Wide Deep Learning
  4. python autohotkey_PyAutoGUI-python版的autoit/AHK
  5. 既稳又狂!黑鲨游戏手机2官宣发布时间:3月18日北京见
  6. A - C语言实验——最值
  7. cross-validation:从 holdout validation 到 k-fold validation
  8. pane Java_ToolPane.java
  9. 2021-07-13 CNN池化理解学习
  10. 使用纯JavaScript实现全网页动态樱花飘落特效
  11. f检验matlab计算,方差分析F检验的步骤和判定
  12. Word怎么显示目录
  13. Flutter访问webservice
  14. #萌新日志#3.使用pix2pix CycleGAN和3d CycleGAN实现T1和T2加权模态的互转
  15. 生产计划排程为什么会这么难?
  16. ArcEngine10 ecp 授权
  17. SAP ABAP——SAP简介(四)【SAP GUI】
  18. Python 数据库连接方法和数据库连接池
  19. YTU 3090 团体操排序
  20. 第 14 章:笑傲江湖,通过注解配置和包自动扫描的方式完成Bean对象的注册

热门文章

  1. android 视频的缩略图 缓存机制和 异步加载缩略图
  2. 【c++】【转】如何只在heap上创建对象,如何只在stack上建立对象?
  3. IOS-资源最小化之点九图片的使用
  4. HowTO: Create an Event Log Source in code, without the Permission errors
  5. java线程 kill linux_linux查看进程和线程的命令
  6. wp trackback.php,WordPress工作原理
  7. minicom的按键控制_minicom使用指南
  8. tensorflow2 存取模型_思维导图:长短期记忆模型
  9. C#专业矩阵运算库——Math.Net
  10. 在哪个公众号学python好_怎么通过公众号来快速学习python编程?