0
MemberwiseClone(Object fromObject, Object toObject)

这是我一生中想多次使用的功能。与 MemberwiseClone 的当前实现相比,它具有巨大的优势,因为它不会产生任何垃圾。

例如,假设您有一个包含 1000 个对象的数组,并且您想要遍历并测试调用 SomeFunction() 对对象的影响,而不会破坏原始对象。在科学模拟领域相当普遍。

如果您使用 MemberwiseClone 的现有实现,您将创建 1000 个垃圾对象。如果我建议的方法存在,您可以创建 1 个对象并将其重用于所有迭代。这显然为 GC 创造了更少的垃圾和更少的工作。我无法想象该方法的实现会与原始方法有那么大的不同,所以我猜它几乎不需要时间来添加到框架中。

虽然完全可以为逐字段复制的对象维护 GetCopy() 方法,但这样做有两个问题。首先,它必须得到维护。每当添加新字段时,如果您忘记将其添加到 GetCopy,您的程序就会损坏。其次,对于大型对象,它比复制内存块的效率要低得多。

我不得不求助于在我的对象中嵌入结构来存储所有字段,然后我不需要记住将它们添加到 GetCopy 方法中,我可以通过一次分配将它们全部复制。这样做的问题是它使代码非常难看。

那么,这种方法从未实施过有充分的理由吗?还是它没有我想象的那么有用。

4

2 回答 2

3

那么,这种方法从未实施过有什么原因吗?还是它没有我想象的那么有用。

只有您的班级才能保证知道 MemberwiseClone 是否是有效的使用方法。私有字段引用的值是否对一个实例是唯一的?某些字段是否与实例的生命周期有关?是否存在必须由构造函数设置的只读字段?MemberwiseClone 应该只在类实现中调用是有道理的。

例如,假设您有一个包含 1000 个对象的数组,并且您想要迭代并测试调用 SomeFunction() 对对象的影响,而不会破坏原始对象。在科学界相当普遍的现象。

  • 如果您正在编写测试,它们应该已经是独立的。

  • 如果您想要一个基于某种转换的新数组,则转换函数应该是返回一个新对象的函数,而不是改变原始对象。

编辑

我了解您希望将字段复制到现有对象而不是创建另一个克隆实例以避免实例化的开销(尽管我不确定实例化是否真的有任何重大开销)。

问题是其他对象可能引用您的第一个克隆,并且当您再次还原它时无法知道它是一个“新”克隆。将这种方法称为“克隆”是没有意义的,因为真正的克隆是一个新对象。

对于还原功能,将其置于类内部仍然更有意义,原因与 MemberwiseClone 相同。采用任意克隆并将所有字段应用于另一个任意对象的通用函数做出了太多假设。对象本身应该负责在初始化时克隆自己,并恢复适当的字段。

于 2013-08-09T14:40:41.117 回答
0

该功能将很有用,但是对于诸如“为什么 x 显然有用却不存在?”之类的问题的答案。大多数时候是:

[..] 在有人设计、实施、测试、记录和发布该功能之前,所有功能都未实现 [..] - Eric Lippert

感谢用户“默认”在评论中引用此内容。这意味着功能需要花钱,所以我们无法拥有所有功能。

在任何情况下,这个特性不能存在或被设计严重破坏都没有根本原因。它会起作用的。

于 2013-08-09T14:08:02.320 回答