社区
C#
帖子详情
clone的原理是什么?
杨友山
博客专家认证
2011-11-15 02:28:05
最近手头没事干,看了看设计模式,当看到原型模式的的时候,一直在说的clone方法。突然有个疑问,这个clone方法,当深度clone的时候,拷贝过来的对象和原对象是两个独立的对象吗,是否也分配存储空间?还是说只是一个引用,指向原对象,使用的还是原对象的方法?
这个问题当年也不知道老师讲过没,我就没一点印象。各位大牛们帮我解解惑啊。
...全文
221
10
打赏
收藏
clone的原理是什么?
最近手头没事干,看了看设计模式,当看到原型模式的的时候,一直在说的clone方法。突然有个疑问,这个clone方法,当深度clone的时候,拷贝过来的对象和原对象是两个独立的对象吗,是否也分配存储空间?还是说只是一个引用,指向原对象,使用的还是原对象的方法? 这个问题当年也不知道老师讲过没,我就没一点印象。各位大牛们帮我解解惑啊。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
方法详解_动力节点Java学院
Java中的
clone
方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校
什么是 `__
clone
` 方法?如何使用 `__
clone
` 方法?使用场景是什么?底层
原理
是什么?
_
clone
。
【C++】多态-最全解析(多态是什么?如何使用多态?多态的底层
原理
是什么?)
2️⃣:什么是虚函数? 代码中关键字 virtual 是干什么的 ? 3️⃣:为什么 派生类中 可以出现 和 基类 同样的函数,这样会不会构成 继承中的 隐藏呢 ? 4️⃣:为什么 指向基类(Pet)的指针可以指向派生类(Dog ...
java
clone
原理
_详解Java中的
clone
方法 -- 原型模式
Java中对象的创建
clone
顾名思义就是复制, 在Java语言中, ...1 使用new操作符创建一个对象2 使用
clone
方法复制一个对象那么这两种方式有什么相同和不同呢?new操作符的本意是分配内存。程序执行到new操作符时,...
java
clone
原理
_
clone
Able接口实现
clone
()
原理
2.其次,你要大概知道什么是地址传递,什么是值传递。3.最后,你要知道你为什么使用这个
clone
方法
Clone
able接口的作用:Object类中的
clone
()是protected的方法,在没有重写Object的
clone
()方法且没有实现
Clone
able...
C#
111,094
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章