为什么要使用Clone()?

Wha*_*sUP 5 c# language-features

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

使用它有什么好处?

Jon*_*Jon 16

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

例如:

void Test(ICloneable original)
{
    var cloned = original.Clone();
}
Run Code Online (Sandbox Code Playgroud)

cloned与运行时类型相同original,您不需要知道执行克隆的类型.

然而,它的用处ICloneable几乎没有,因为它没有定义克隆操作的语义:它是浅拷贝还是深拷贝?由于界面不强制执行其中一个,您无法真正知道自己要回来的内容.因为知道这是必不可少的,因为你需要相应地处理克隆,所以ICloneable它本身就是一张烧焦的卡片.

使用Clone方法定义自己的接口(具有明确定义的语义)非常有意义.

更新:另请参阅:我为什么要在c#中实现ICloneable?


Bro*_*ass 5

Clone()通常提供对象的拷贝(例如,参见Array.Clone()),它复制引用但不复制被引用的对象。

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