为什么要使用Clone()?
在C#中使用Clone()的主要目的是什么?
使用它有什么好处?
我们的想法是,使用Clone
您可以创建一个与您调用它相同类型的新对象, 而无需知道要调用它的对象的确切类型 。
例如:
void Test(ICloneable original) { var cloned = original.Clone(); }
这里cloned
是与original
相同的运行时类型,您不需要知道执行克隆的类型。
然而, ICloneable
的用处几乎没有,因为它没有定义克隆操作的语义 :它是浅拷贝还是深拷贝 ? 由于界面不会强制执行其中一个,您无法真正知道自己要回来的内容。 因为知道这是必不可少的,因为你需要相应地处理克隆,所以ICloneable
本身就是一张烧焦的卡片。
使用Clone
方法(具有明确定义的语义)定义自己的接口非常有意义。
更新:另请参阅: 为什么我应该在c#中实现ICloneable?
Clone()
通常提供对象的浅表副本(即参见Array.Clone() ),它复制引用但不复制引用的对象。
如果你理解它的局限性很方便,主要是实际被复制到新对象中的语义主要留给Clone()
方法的实现者,因为定义the Clone()
方法的接口ICloneable
是不明确的(所以它可能是浅拷贝或深拷贝,但你不能依赖于)。
当我们将一个对象的内容复制到另一个(SomeClass obj2 = obj1)时,obj2也属于同一个类,修改obj2的内容也会修改obj1的内容。 这是因为它们是引用类型。 使用Clone()(以适当的方式)可以避免这种情况。 在修改克隆对象时,不会修改原始对象。