为什么要在c#中实现ICloneable?

你能向我解释为什么我应该从ICloneableinheritance并实现Clone()方法吗?

如果我想做一个深层次的复制,我不能只实现我的方法? 我们说MyClone()

我为什么要inheritanceICloneable ? 有什么优势? 这只是使代码更“可读”吗?

你不应该。 Microsoftbuild议不要实施ICloneable因为从接口没有明确的指示您的Clone方法是执行“深层”还是“浅层”克隆。

有关更多信息,请参阅2003年Brad Abrams的博客文章 (!)。

ICloneable接口本身并不是非常有用,也就是说,实际上并不是很多情况下知道一个对象是可复制的,而不知道其它的东西。 这是一个非常不同的情况,例如IEnumerableIDisposable ; 有很多情况下,接受IEnumerable是有用的,除了如何枚举它之外,什么都不知道。

另一方面,当作为通用约束与其他约束一起应用时, ICloneable可能是有用的。 例如,一个基类可能会有用地支持一些衍生物,其中一些可能被有用地克隆,而其中一些则不能。 如果基本types本身公开了一个公共克隆接口,那么任何不可克隆的派生types都将违反Liskovreplace原则。 避免此问题的方法是使基types支持使用Protected方法克隆,并允许派生types在他们认为合适的情况下实现公共克隆接口。

一旦完成,一个想要接受WonderfulBasetypes的对象并需要克隆它的方法可以被编码为接受一个支持克隆的WonderfulBase对象(使用基types和ICloneable的genericstypes参数约束)。 尽pipeICloneable接口本身不会表示深度或浅层克隆,但WonderfulBase的文档将指示可克隆WonderfulBase是深度还是浅层克隆。 本质上, ICloneable接口不会完成任何通过定义ICloneableWonderfulBase不能完成的任何事情,除非它将避免为每个不同的可复制基类定义不同的名称。

ICloneable是BCL中那些引起争议的文物之一。 恕我直言,没有真正的原因来执行它。 有了这个说,如果我要创build一个克隆方法,那么我会实现ICloneable ,并提供我自己的强大的Clone版本。

ICloneable的问题是从来没有表明,如果Clone是一个浅或深的副本,是非常不同的东西。 没有ICloneable<T>的事实可能是微软对ICloneable的看法

马特是正确的,不要使用它。 创build你自己的Copy()方法(或类似的名字),并在公共API中清楚地说明你的方法是创build对象的深层还是浅层拷贝。