今天在看.net设计模式(http://terrylee.cnblogs.com/archive/2006/01/16/317896.html)的时候,突然看到浅拷贝与深拷贝的一些细节,就想这两者到底有什么区别呢,确实对此了解得不多,于是就上网找找资料,然后在csdn下看到了一篇这样的文章,转http://dev.csdn.net/develop/article/20/20324.shtm,这里贴出来让也同样不了解类似概念的大家看下是怎么回事:
简介
本文我将讨论.NET编程中一个比较感兴趣的方面——对象克隆。下面将讨论对象克隆的必要性、对象克隆的方法以及关于对象克隆的一些思考。
背景
大家一定知道.NET对象是有二大类型的:  值类型和引用类型。 值类型对象的变量表示对象本身,而且具有“copy-on-assignment”的行为。也就是说, 以下的讨论不适用于值类型。
另一方面,引用类型的变量实际上是指向堆上的内存。 因此,如果你创建了一个引用类型的变量,并且将一个已存在的对象分配给它,实际上是创建了指向堆上的相同内存的另外一个对象。本文就是讨论这样的情况:创建的一个对象的新的拷贝,并且保存在一个变量中!
为什么要克隆?
我 认为当设置一个对象的状态要付出昂贵的代价,并且又需要取得该对象的一个拷贝以便改变当前的一些状态时,克隆就显得十分必要。下面列举一个刚好能体现我刚 刚所说的情况的例子。 就拿 DataTable 类来说吧。建立一个 DataTable 会包含诸如以下的操作:为取得架构和数据而查询数据库、添加约束、设置主键等等。那么,当需要该 DataTable 的一个新的拷贝,哪怕是对架构作极小的改变或添加新的一行记录等等, 明智的选择会是克隆已存在的对象再对其进行操作,而不是创建一个新的DataTable, 那样将需要更多的时间和资源。

克隆也广泛应用于数组和集合,这些时候往往会多次需要已存在对象的一个拷贝。 克隆的类型我 们基于克隆的程度将克隆分成两大类:“深层”克隆和“浅表”克隆。“浅表”克隆得到一个新的实例,一个与原始对象类型相同、包含值类型字段的拷贝。但是, 如果字段是引用类型的, 该引用将被拷贝, 而不是拷贝引用的对象。 因此,原始对象的引用和克隆对象的引用都指向同一个对象。另一方面, 对象的“深层”克隆包含原始对象直接或间接引用的对象的所有拷贝。下面举例说明。

对象X引用对象A,对象A引用对象M。对象X的“浅表”克隆对象Y,同样也引用了对象A。相对比的是,对象X的“深层”克隆对象Y,却直接引用了对象B,并且间接引用对象N,这里,对象B是对象A的拷贝,对象N是对象M的拷贝。实现克隆
System.Object提供了受保护的方法 MemberwiseClone,可用来实现“浅表”克隆。由于该方法标记为“受保护”级别,因此,我们只能在继承类或该类内部才能访问该方法。
.NET定义了一个IClonable接口,一个需要“深层”克隆而不是“浅表”克隆的类必须实现该接口。我们需要提供一个好的实现方法来达到该接口的Clone方法实现的功能。
有 许多方法可以实现“深层”克隆。一个方法是将对象串行化到内存流中,然后反串行化到一个新的对象。我们将使用一个二进制(Binary)的 Formatter类或SOAP formatter类来进行深层串行化。做一个深写成连载长篇而刊登的 formatter 。 这个方法的问题是类和它的成员 (完整的类表) 必须被标记为serializable,否则formatter会发生错误。
反射是另外一个能达到相同目的的方法。 Amir Harel写的一篇好文章吸引了我, 他使用该方法提供一个好的克隆实现。 这篇文章讨论得非常好! 以下是链接:http://www.codeproject.com/csharp/cloneimpl_class.asp

上面讨论的任何一个方法,都要求对象的成员类型能支持自我克隆,以确保“深层”克隆能成功进行。也就是说, 对象必须是可串行化的(serializable) ,或者每个独立的成员必须提供IClonable的实现。 如果不这样,我们根本不可能对对象进行“深层”克隆!综述
克隆是提供给程序员的一个很好的方 法。但是, 我们应该知道什么时候需要提供这样的功能,而且在某些情况下,严格地说,对象不应该提供这一个特性。 以SQLTransaction 类为例, 就不支持克隆。这一个类代表了SQL Server数据库的一个事务。 克隆该对象没有任何意义,因为我们可能不能够理解一个数据库的一个活动的事务的克隆! 因此,如果你认为克隆对象的状态会产生应用程序逻辑上的矛盾,就不需要支持克隆。

作者:Leepy
邮箱:sunleepy(AT)gmail.com
出处:http://liping13599168.cnblogs.com/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
http://www.cnblogs.com/liping13599168/archive/2007/07/28/834242.html

.NET对象克隆的深究(转)相关推荐

  1. Java学习总结:34(对象克隆)

    对象克隆 对象克隆就是对对象的复制操作,在Object类中存在一个clone()方法用于对象的克隆操作.该方法如下: protected Object clone() throws CloneNotS ...

  2. public接口可以被任何一个类实现_一文带你深入Java核心技术:对象克隆+接口与回调,还有这种操作...

    对象克隆 当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,如图6-1所示.这就是说,改变一个变量所引用的对象将会对另一个变量产生影响. Employee original = new Employ ...

  3. java对象序列化克隆_JAVA 对象克隆和序列化

    先用一个例子来说明假克隆吧,也就是用"="之后的效果.. [运行结果]: [运行结果] 姓名:rollen年龄:20 姓名:hello world年龄:100 姓名:hello w ...

  4. JavaScript对象克隆

    前言 之前有人问我如何克隆一个JS对象,我当时没答上来:过后我查资料弄懂了这个问题,现在整理成文. 正文 JavaScript的一切实例都是对象,但他们也分为原始类型和引用类型.原始类型对象指的是字符 ...

  5. __clone class php_PHP 对象克隆 clone 关键字与 __clone() 方法

    clone 关键字用于克隆一个完全一样的对象,__clone() 方法来重写原本的属性和方法. 对象克隆 有的时候我们需要在一个项目里面使用两个或多个一样的对象,如果使用 new 关键字重新创建对象, ...

  6. JS类型判断、对象克隆、数组克隆

    类型判断 我们先说一下JS的数据类型,我们一般说JS有六大数据类型(ES6以前)分别是: 基本数据类型 Number String Boolean null undefined 引用数据类型 obje ...

  7. java 克隆_Java实现对象克隆的方法

    前言 这也是昨天的面试题. 当时只说了深拷贝以及浅拷贝,面试官问了两遍还有吗,我很肯定的说就这两种了,面试结束之后查了一下,啪啪打脸. 正文 JAVA实现克隆有两种形式 浅克隆 深克隆 浅克隆与深克隆 ...

  8. Java提升篇:对象克隆(复制)

    引论 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,sho ...

  9. 常见Java面试题之如何实现对象克隆

    如何实现对象克隆 有两种方式: 1)实现Cloneable接口并重写Object类中的clone()方法: 2) 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深 ...

最新文章

  1. torch.nn.functional.cross_entropy.ignore_index
  2. 计算机书籍-数据挖掘与预测分析
  3. I210网卡LINUX的mac,linux i210 网卡驱动解读
  4. 秀!微软《550页图解.Net+WPF完整版》.pdf 附下载!
  5. 有人说,互联网电商把1000个实体店老板赚的钱,让10个互联网电商赚走了
  6. list集合排序_Java面试第七部分 Java的集合
  7. 深度学习实战之手写签名识别(100%准确率、语音播报)
  8. 工业级嵌入式串口转wifi模块
  9. 超实用干货丨通过率90%的软件测试简历长什么样?
  10. 【IoT】 产品设计:结构设计流程
  11. 怎么把两个PDF合并成一个?这几种操作轻松合并
  12. LSD直线检测和霍夫线变换的学习建议
  13. 在不同linux服务器上复制anaconda的虚拟环境注意事项
  14. 计算机科学 基础课程
  15. JAVA —— 比较日期时间大小
  16. Linux下 单网卡配置多个ip方法
  17. 有没有c 或c语言的短期培训学校,根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样...
  18. android开发 实现动态获得app的cpu占有率并导出文件的两种方法。
  19. 扬州市计算机职业学校名称,扬州市职业学校2019对口高考班适应性考试计算机试卷.doc...
  20. 完全开源的仓库管理系统,无需付费即可搭建一套商业级WMS

热门文章

  1. QML基础类型之size
  2. QML基础类型之data
  3. 经典C语言程序100例之五一
  4. 神奇的机器人评课_《聪明的机器人》教学反思
  5. SpringCloud Finchley基础教程:3,spring cloud gateway网关
  6. nginx常用的超时配置说明
  7. Scikit-learn数据预处理分类变量编码之等级变量编码
  8. QFile练习(20200213)
  9. 协方差代表的意义是什么?
  10. NC119-最小的k个数