MemberwiseClone(Object fromObject, Object toObject)
这是我本来希望在我的生活中多次使用的功能。它比当前的MemberwiseClone实现具有巨大的优势,因为它不会产生任何垃圾。
例如,假设您有一个包含1000个对象的数组,并且您希望迭代并测试调用SomeFunction()对对象的影响,而不会损坏原始对象。在科学模拟世界中相当普遍。
如果您使用MemberwiseClone的现有实现,那么您将创建1000个对象的垃圾。如果我建议的方法存在,您可以创建1个对象并将其重用于所有迭代。这显然创造了更少的垃圾和更少的GC工作。我无法想象该方法的实现与原始方法有很大不同,所以我猜测它几乎没有时间添加到框架中。
尽管为逐个字段复制的对象维护GetCopy()方法是完全可能的,但这有两个问题。首先,它必须得到维护。每当添加新字段时,如果您忘记将其添加到GetCopy,您的程序就会中断。其次,对于大型对象,它比复制克隆的内存块效率低得多。
我不得不求助于在我的对象中嵌入结构来存储所有字段,然后我不需要记住将它们添加到GetCopy方法中,并且我可以使用单个赋值将它们全部复制。这个问题是它使代码真的很难看。
那么,这个方法从未实现过吗?或者它没有我想象的那么有用。
答案 0 :(得分:3)
那么,这个方法从未实现过吗?或者它没有我想象的那么有用。
只保证您的班级知道MemberwiseClone是否是一种有效的使用方法。私有字段引用的值是否应该对一个实例唯一?某些字段是否与实例的生命周期有关?是否只有构造函数必须设置的只读字段?有意义的是,只应在类实现中调用MemberwiseClone。
比方说,你有一个1000个对象的数组,你想要的 迭代并测试调用SomeFunction()的效果 没有破坏原件的物体。一种相当常见的情况 在科学界。
如果您正在编写测试,那么它们应该已经是自包含的。
如果你想要一个基于某些变换的新数组,转换函数应该是返回一个新对象的函数,而不是改变原始对象。
修改强>
我知道您希望将字段复制到现有对象而不是创建另一个克隆实例,以避免实例化的开销(我不确定实例化是否真的有任何重大开销)。
问题是其他对象可能是指你的第一个克隆,并且当你再次恢复它时无法知道它是一个“新”克隆。将这种方法称为“克隆”是没有意义的,因为真正的克隆是一个新对象。
对于 revert 功能,由于与MemberwiseClone相同的原因,它仍然更适合作为内部类。采用任意克隆并将所有字段应用于另一个任意对象的泛型函数会产生太多假设。对象本身应该负责在初始化时克隆自身,并恢复相应的字段。
答案 1 :(得分:0)
该功能很有用,但问题的答案如“为什么x不存在虽然它显然有用?”大部分时间都是:
[..]所有功能都没有实现,直到有人设计,实施, 测试,文档和发布功能[..] - Eric Lippert
感谢用户“Default”在评论中引用此内容。这意味着功能需要花钱,所以我们不能拥有所有功能。
在任何情况下,没有根本原因可以解释为什么这个功能不能存在或者被设计严重破坏。它会起作用。