2011-03-26 123 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的內容。這是因爲它們是參考類型。使用克隆()(以適當的方式)可以避免這種情況。在修改克隆的對象時,原始內容不會被修改。