clone的原理是什么?

杨友山
博客专家认证
2011-11-15 02:28:05
最近手头没事干,看了看设计模式,当看到原型模式的的时候,一直在说的clone方法。突然有个疑问,这个clone方法,当深度clone的时候,拷贝过来的对象和原对象是两个独立的对象吗,是否也分配存储空间?还是说只是一个引用,指向原对象,使用的还是原对象的方法?
这个问题当年也不知道老师讲过没,我就没一点印象。各位大牛们帮我解解惑啊。
...全文
212 10 打赏 收藏 转发到动态 举报
写回复
用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这个对象的实例。

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧