社区
C#
帖子详情
clone的原理是什么?
杨友山
领域专家: 后端开发技术领域
2011-11-15 02:28:05
最近手头没事干,看了看设计模式,当看到原型模式的的时候,一直在说的clone方法。突然有个疑问,这个clone方法,当深度clone的时候,拷贝过来的对象和原对象是两个独立的对象吗,是否也分配存储空间?还是说只是一个引用,指向原对象,使用的还是原对象的方法?
这个问题当年也不知道老师讲过没,我就没一点印象。各位大牛们帮我解解惑啊。
...全文
269
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这个对象的实例。
Java
Clone
方法
原理
本文解析了Object类的
clone
方法的工作
原理
。它通过将对象作为二进制流复制到新的内存区域来实现深拷贝,避免了构造函数的调用。
MySQL运维实战之
Clone
插件(10.2)
Clone
插件
原理
本文详细介绍了MySQL中
Clone
插件的工作
原理
,包括其四个主要阶段:初始阶段、文件复制阶段、页面复制阶段及Redo复制阶段。并深入探讨了
Clone
插件如何确保数据的一致性。
java
clone
原理
本文解释了Java中使用super.
clone
()的原因,以及如何正确地实现
Clone
able接口以避免
Clone
NotSupportedException异常。探讨了浅复制的实现机制及其对不同类型的成员变量的影响。
dyn-
clone
核心
原理
解析:如何让 trait 对象支持
Clone
?
dyn-
clone
是 Rust 中实现对象安全
Clone
的核心库,通过定义 Dyn
Clone
trait、利用 Sealed 模式防止外部误实现、自动为所有
Clone
类型提供 Dyn
Clone
实现,并提供
clone
_box 函数和
clone
_trait_object! 宏来支持 trait 对象的克隆。其设计基于胖指针操作与零开销抽象,适用于插件系统、状态管理等需动态分发与克隆的场景。
Git
Clone
原理
详解:为什么它比本地文件复制更快? -优雅草卓伊凡
本文深入探讨了Git
Clone
的工作
原理
,解释其比本地文件复制更快的原因。Git
Clone
基本流程包括初始化本地仓库、下载远程仓库数据、解压并重建文件。其存储基于对象数据库,采用压缩传输、仅下载必要数据、本地索引优化等策略,还通过比喻帮助理解。
C#
111,129
社区成员
642,535
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章