【发布时间】:2011-03-26 15:45:24
【问题描述】:
在 C# 中使用 Clone() 的主要目的是什么?
使用它有什么好处?
【问题讨论】:
-
它的定义不是很清楚吗? ;-)
-
主要目的是创建一个对象的克隆。好处是有副本。还有什么问题吗?
标签: c# language-features
在 C# 中使用 Clone() 的主要目的是什么?
使用它有什么好处?
【问题讨论】:
标签: c# language-features
这个想法是,使用Clone,您可以创建一个与您调用它的对象类型相同的新对象,无需知道您调用它的对象的确切类型。
例如:
void Test(ICloneable original)
{
var cloned = original.Clone();
}
这里的cloned 与original 的运行时类型相同,您无需知道该类型是什么即可执行克隆。
然而ICloneable 的用处几乎没有,因为它没有定义克隆操作的语义:它是shallow copy 还是deep copy?由于界面不强制要求其中之一,因此您无法真正知道您得到了什么。由于知道这一点很重要,因为您需要相应地处理克隆,ICloneable 本身几乎就是一张烧毁的卡片。
不过,使用Clone 方法(具有明确定义的语义)定义您自己的接口非常有意义。
【讨论】:
Clone() 通常提供一个对象的 shallow 副本(例如,参见 Array.Clone() ),它复制引用而不是引用的对象。
如果您了解它的局限性,这很方便,主要是实际复制到新对象中的语义大部分留给Clone() 方法的实现者,因为接口@987654322定义 Clone() 方法的 @ 未指定(因此它可能是浅拷贝或深拷贝,但您不能依赖其中任何一种)。
【讨论】:
当我们将一个对象的内容复制到另一个对象(SomeClass obj2 = obj1)时,obj2也属于同一个类,修改obj2的内容也会修改obj1的内容。这是因为它们是引用类型。使用 Clone() (以适当的方式)可以避免这种情况。在修改克隆对象时,原始对象不会被修改。
【讨论】: