2011-03-26 125 views
4

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

使用它有什么好处?

+1

从定义中不清楚吗? ;-) – zerkms 2011-03-26 15:47:20

+2

主要目的是创建一个对象的克隆。好处是有重复。还有问题吗? – Ingo 2011-03-26 15:49:29

+0

[为什么我应该在c#中实现ICloneable?](http://stackoverflow.com/questions/699210/why-should-i-implement-icloneable-in-c) – 2011-03-26 15:58:30

回答

14

的想法是,使用Clone您可以创建同一类型的一个调用它,不知道要调用它对象的确切类型的新对象。

例如:

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

这里cloned相同运行时类型为original,而你并不需要知道是什么类型是执行克隆。

然而ICloneable用处是非常没有,因为它没有定义语义克隆操作的:它是一个shallow copydeep copy?由于界面没有强制要求,你不能真正知道你回来的是什么。而且由于知道这一点至关重要,因为你需要相应地处理克隆,所以ICloneable本身就是一张烧毁的卡片。

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

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

3

Clone()通常提供对象的副本(即见Array.Clone()),它复制引用而不是引用的对象。

如果你了解它的局限性,主要是在语义的究竟是什么被复制到新的对象大多留给Clone()方法的实施者,因为它定义the Clone()方法接口ICloneable正在指定它的方便(所以它可能是浅拷贝或深拷贝,但你不能依赖)。

0

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