他们显然在某个地方使用它,他们为什么不给这样的方法呢? (即使他们没有在任何地方使用它,他们仍然可以给我们这样的方法)。
答案 0 :(得分:9)
可能是因为深度克隆的天真实施比帮助更危险。人们可能很容易意外地克隆整个应用程序堆的大块 - 包括不应该克隆的东西。在实践中,深度克隆通常是特定于实现的 - 克隆者知道它正在寻找什么,并且只遵循这些路径。
还有Eric Lippert的经典答案 - 他们没有提供它,因为 adding simple things is hard.
答案 1 :(得分:2)
因为每个对象都有不同的深度克隆行为;一些对象将是singleton并且根本不可克隆,而且“深度克隆”的概念对于每个对象都不那么明显。
答案 2 :(得分:1)
深度复制(或克隆)通常不容易,因为类通常包含对其他类的引用,这些类可能难以表示为“顺序存储器块”并因此复制。这就是为什么它通常是通过序列化/反序列化对象来完成的:这样你就可以控制实际复制的内容和方式。
如果您有兴趣亲身体验这一点,可以尝试编写自己的序列化程序。这将是一个非常有趣的项目,你会发现许多隐藏在这个看似简单的话题背后隐藏的细微问题。
答案 3 :(得分:0)
BinaryFormatter的本机行为实际上是一个深层克隆。自.NET 1.0以来一直有一个IClonable接口,但它已被淘汰,MS建议AGAINST实现这个接口,特别是因为担心消费者不一定知道IClonable实现是执行深度还是浅层克隆。深度克隆是危险的。
答案 4 :(得分:0)
因为深度克隆严重到足以保证几个名称空间。参见序列化。