社区
C#
帖子详情
clone的原理是什么?
杨友山
博客专家认证
2011-11-15 02:28:05
最近手头没事干,看了看设计模式,当看到原型模式的的时候,一直在说的clone方法。突然有个疑问,这个clone方法,当深度clone的时候,拷贝过来的对象和原对象是两个独立的对象吗,是否也分配存储空间?还是说只是一个引用,指向原对象,使用的还是原对象的方法?
这个问题当年也不知道老师讲过没,我就没一点印象。各位大牛们帮我解解惑啊。
...全文
212
10
打赏
收藏
clone的原理是什么?
最近手头没事干,看了看设计模式,当看到原型模式的的时候,一直在说的clone方法。突然有个疑问,这个clone方法,当深度clone的时候,拷贝过来的对象和原对象是两个独立的对象吗,是否也分配存储空间?还是说只是一个引用,指向原对象,使用的还是原对象的方法? 这个问题当年也不知道老师讲过没,我就没一点印象。各位大牛们帮我解解惑啊。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
杨友山
2011-11-15
打赏
举报
回复
[Quote=引用 9 楼 sandy945 的回复:]
new 一个新的实例出来 是没有相应 状态的
就是属性值和字段都是默认值
[/Quote]
原来是这样
阿非
2011-11-15
打赏
举报
回复
[Quote=引用 5 楼 yysyangyangyangshan 的回复:]
依照msdn那意思好像深度clone就是 弄出来另一个对象,也分配存储空间,其本质就相当于new了一个对象。那么这个原型模式到底想体现什么呢?
[/Quote]
new 一个新的实例出来 是没有相应 状态的
就是属性值和字段都是默认值
Daqing
2011-11-15
打赏
举报
回复
深拷贝是独立出来的,相当于new出来的对象,开辟了新的堆存放该对象。但是和new区别是它拷贝了调用该对象的所有属性值。深拷贝根据情况使用,比如你需要原来对象的数据
浅拷贝不是独立的,是在一个存储区域,可以理解成是实际对象的影子。如果后面对对象属性值改变,则原来的对象相应的改变。浅拷贝在树中用到
sl2161
2011-11-15
打赏
举报
回复
[Quote=引用楼主 yysyangyangyangshan 的回复:]
最近手头没事干,看了看设计模式,当看到原型模式的的时候,一直在说的clone方法。突然有个疑问,这个clone方法,当深度clone的时候,拷贝过来的对象和原对象是两个独立的对象吗,是否也分配存储空间?还是说只是一个引用,指向原对象,使用的还是原对象的方法?
这个问题当年也不知道老师讲过没,我就没一点印象。各位大牛们帮我解解惑啊。
[/Quote]
在N层撤销的时候是相当有意义的
为什么?
还是继续Person的例子,Person中包含2个属性,Name,和Age
如果通过New出来的Person,Name和Age是确定的,为Name1,Age1,第一次我修改为Name2,Age2,第二次我修改为Name3,Age3,我现在想回到第一次修改的时候,怎么办,你总不能New一个Name2,Age2吧,最好的办法就是每次修改都将上一次的Person克隆一份放到栈(数据结构:后进先出),撤销的时候通过栈去取那份深拷贝对象
MKing0412
2011-11-15
打赏
举报
回复
[Quote=引用 5 楼 yysyangyangyangshan 的回复:]
依照msdn那意思好像深度clone就是 弄出来另一个对象,也分配存储空间,其本质就相当于new了一个对象。那么这个原型模式到底想体现什么呢?
[/Quote]
MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。 如果字段是值类型的,则对该字段执行逐位复制。 如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
msdn上说的 和new一个 不同。
杨友山
2011-11-15
打赏
举报
回复
依照msdn那意思好像深度clone就是 弄出来另一个对象,也分配存储空间,其本质就相当于new了一个对象。那么这个原型模式到底想体现什么呢?
MKing0412
2011-11-15
打赏
举报
回复
克隆实例详解
sl2161
2011-11-15
打赏
举报
回复
Person p = new Person();
Person p1 = p.clone();
clone就是复制了一个p,和p完全没有任何关系,除了长得一模一样,就算杀了p,p1依然还或者
Person p = new Person();
p1 = p;
这个就不一样了,可以理解为p1仅仅是留了一个p的电话号码,可以随叫随到,如果p被杀了,那么p1也同样的失效了
阿非
2011-11-15
打赏
举报
回复
MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。 如果字段是值类型的,则对该字段执行逐位复制。 如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
例如,考虑引用对象 A 和 B 的被称为 X 的对象。 对象 B 依次引用对象 C。 X 的浅表副本创建一个新对象 X2,该对象也引用对象 A 和 B。 相比而言,X 的深层副本创建一个新对象 X2,该对象引用新对象 A2 和 B2(分别为 A 和 B 的副本)。 B2 又引用新对象 C2,C2 是 C 的副本。 该示例阐释了浅层和深层复制操作之间的区别。
http://msdn.microsoft.com/zh-cn/library/system.object.memberwiseclone.aspx
杨友山
2011-11-15
打赏
举报
回复
如果拷贝过来的是独立的对象的话,那么这个模式有什么意义呢,还不如new这个对象的实例。
C 语言实现 linux pwd 命令内含源码以及说明书可以自己运行复现.zip
C 语言实现 linux pwd 命令内含源码以及说明书可以自己运行复现.zip
2024年中国变焦LED手电筒行业研究报告.docx
2024年中国变焦LED手电筒行业研究报告
node-v8.11.2-darwin-x64.tar.xz
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
node-v4.8.2-x86.msi
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
ffmpeg 结合 SDL 编写播放器内含源码以及说明书可以自己运行复现.zip
ffmpeg 结合 SDL 编写播放器内含源码以及说明书可以自己运行复现.zip
C#
110,552
社区成员
642,562
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章