【问题标题】:Why should I implement ICloneable in c#?为什么要在 C# 中实现 ICloneable?
【发布时间】:2010-10-16 11:59:39
【问题描述】:

你能解释一下为什么我应该从ICloneable继承并实现Clone()方法吗?

如果我想做一个深拷贝,我不能只实现我的方法吗?比如MyClone()

我为什么要从ICloneable 继承?有什么优势?只是让代码“更具可读性”吗?

【问题讨论】:

标签: c# .net cloneable icloneable


【解决方案1】:

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

有关详细信息,请参阅 2003 年的 this blog post from Brad Abrams(!)。

【讨论】:

【解决方案2】:

ICloneable 是 BCL 中一直存在争议的工件之一。恕我直言,没有真正的理由来实施它。话虽如此,如果我要创建一个克隆方法,那么我会实现ICloneable,并提供我自己的Clone 的强类型版本。

ICloneable 的问题是它从来没有指出Clone 是浅拷贝还是深拷贝,这是非常不同的事情。没有ICloneable<T>这一事实可能表明微软对ICloneable的想法

【讨论】:

    【解决方案3】:

    马特是正确的,不要使用它。创建您自己的 Copy() 方法(或类似名称)并在您的公共 API 中完全清楚您的方法是创建对象的深层还是浅层副本。

    【讨论】:

      【解决方案4】:

      ICloneable 接口本身不是很有用,也就是说,在不知道其他任何信息的情况下知道对象是可克隆的确实有用的情况并不多。它。这是一个非常不同的情况,例如IEnumerableIDisposable;在许多情况下,接受IEnumerable 而不知道如何枚举它是很有用的。

      另一方面,ICloneable 在作为通用约束与其他约束一起应用时可能很有用。例如,一个基类可能有用地支持许多派生类,其中一些可以有用地克隆,而另一些则不能。如果基类型本身暴露了一个公共克隆接口,那么任何不能被克隆的派生类型都会违反里氏替换原则。避免这个问题的方法是让基类型支持使用受保护的方法进行克隆,并允许派生类型实现它们认为合适的公共克隆接口。

      一旦完成,想要接受 WonderfulBase 类型的对象并需要能够克隆它的方法可以被编码为接受支持克隆的 WonderfulBase 对象(使用泛型类型参数基本类型和ICloneable 约束)。尽管ICloneable 接口本身不会指示深克隆或浅克隆,但WonderfulBase 的文档将指示可克隆WonderfulBase 应该是深克隆还是浅克隆。从本质上讲,ICloneable 接口不会完成通过定义 ICloneableWonderfulBase 无法完成的任何事情,除了它可以避免为每个不同的可克隆基类定义不同的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-06
        • 2010-12-14
        • 1970-01-01
        • 2011-02-24
        • 2015-11-22
        • 2021-06-09
        • 2010-09-15
        • 2013-08-20
        相关资源
        最近更新 更多