【问题标题】:Why use Clone()?为什么使用克隆()?
【发布时间】:2011-03-26 15:45:24
【问题描述】:

在 C# 中使用 Clone() 的主要目的是什么?

使用它有什么好处?

【问题讨论】:

标签: c# language-features


【解决方案1】:

这个想法是,使用Clone,您可以创建一个与您调用它的对象类型相同的新对象,无需知道您调用它的对象的确切类型

例如:

void Test(ICloneable original)
{
    var cloned = original.Clone();
}

这里的clonedoriginal 的运行时类型相同,您无需知道该类型是什么即可执行克隆。

然而ICloneable 的用处几乎没有,因为它没有定义克隆操作的语义:它是shallow copy 还是deep copy?由于界面不强制要求其中之一,因此您无法真正知道您得到了什么。由于知道这一点很重要,因为您需要相应地处理克隆,ICloneable 本身几乎就是一张烧毁的卡片。

不过,使用Clone 方法(具有明确定义的语义)定义您自己的接口非常有意义。

更新:另见:Why should I implement ICloneable in c#?

【讨论】:

    【解决方案2】:

    Clone() 通常提供一个对象的 shallow 副本(例如,参见 Array.Clone() ),它复制引用而不是引用的对象。

    如果您了解它的局限性,这很方便,主要是实际复制到新对象中的语义大部分留给Clone() 方法的实现者,因为接口@987654322定义 Clone() 方法的 @ 未指定(因此它可能是浅拷贝或深拷贝,但您不能依赖其中任何一种)。

    【讨论】:

      【解决方案3】:

      当我们将一个对象的内容复制到另一个对象(SomeClass obj2 = obj1)时,obj2也属于同一个类,修改obj2的内容也会修改obj1的内容。这是因为它们是引用类型。使用 Clone() (以适当的方式)可以避免这种情况。在修改克隆对象时,原始对象不会被修改。

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        • 2012-07-05
        • 1970-01-01
        • 2012-12-24
        • 2018-01-05
        相关资源
        最近更新 更多