jua*_*uan 20 .net theory cloning
在过去,我需要克隆对象,只是发现它们没有实现Clone()方法,迫使我手动执行(创建一个新实例并将所有属性从原始实例复制到新实例)
为什么克隆不像复制分配对象的内存块那么容易,因此Clone在object类中有方法,.NET中的所有类都继承它?
Jon*_*eet 24
因为那不会执行深度克隆,这通常是克隆真正需要的.想象一下,你有一个数组或列表的引用...只需复制你的对象所占用的内存将简单地克隆引用.通过克隆以及原始对象可以看到对数组的任何更改 - 因此两个对象仍然连接,这违反了正常的克隆点.
如果你想要实现这个功能,那很容易 - 这Object.MemberwiseClone()就是为了什么.在大多数情况下,如果克隆一个对象甚至是有意义的(克隆的NetworkStream意思是什么?),克隆每个属性是有意义的......除非它已经引用了一个不可变的值,等等.换句话说,这是一个自然难的问题,这就是大多数类型不支持克隆的原因.
如果你坚持使用不可变的类型,那就不是一个问题......这使得其他事情变得更加难以置信,但在许多情况下它可能非常强大.
其他人已经解释过MemberwiseClone,但没有人解释为什么它受到保护.我会尝试给出理由.
这里的问题是,MemberwiseClone只是盲目地复制国家.在许多情况下,这是不可取的.例如,对象可能有一个私有字段,它是对a的引用List.一个浅的副本,例如什么MemberwiseClone,会导致新对象指向同一个列表 - 并且可能很好地编写类而不期望该列表与其他任何人共享.
或者一个对象可以有一些在构造函数中生成的ID字段 - 再次,当你克隆它时,你得到两个具有相同ID的对象,这可能导致方法中的各种奇怪的失败,假设ID是唯一的.
或者说你有一个打开套接字或文件流的对象,并存储对它的引用.MemberwiseClone将只复制引用 - 你可以想象试图将调用交错到同一个流的两个对象不会很好地结束.
简而言之,"克隆"不是任意对象的明确定义的操作.operator=默认情况下,在C++中为所有类提供成员的事实更令人讨厌,因为人们常常忘记它在那里,并且不会为复制没有意义的类禁用它,或者是危险的(并且令人惊讶的是很多这样的课程).
| 归档时间: |
|
| 查看次数: |
1578 次 |
| 最近记录: |