2010-02-22 33 views
4

我有一個List<int>會員。如果我想克隆此類的實例,是否需要深層副本或MemberwiseClone()淺拷貝就足夠了?C# - 列表成員需要深度複製嗎?

如果至少有一個成員是對象的引用,那麼我們需要一個深層副本,對吧?這是否意味着有List,DateTime,String,MyClass,...需要一個深層副本?

+2

您是否試圖複製列表或列表中的對象?請編輯你的問題來澄清。 –

+1

你在做什麼克隆? –

回答

8

這完全取決於您打算如何使用副本。

如果你做一個淺拷貝像

List<int> x = new List<int>() { 1, 2, 3, 4, 5 }; 
List<int> y = x; 
y[2] = 4; 

然後x將包含{1,2,4,4,5}

如果你做的列表的深層副本:

List<int> x = new List<int> { 1, 2, 3, 4, 5 }; 
List<int> y = new List<int>(x); 
y[2] = 4; 

那麼x將包含{1,2,3,4,5}和y將包含{1,2,4,4,5}

你如何在用c計劃opy確實決定你是使用淺拷貝還是深拷貝。

2

如果你有List<int> originalList = new List{1, 2} 那麼這樣做:
List<int> newList = new List<int>();
foreach(int i in originalList)
newList.Add(i);

將讓你一個克隆列表。

但是,如果您嘗試了我在上面用某種引用類型的List泛型所做的操作,那麼您將不會成功。在更改列表中的某個對象之後,無論是從原始列表還是新列表中引用該對象,都會看到更改後的版本。

1

簡短的回答,是的。

很長的答案,您需要確定您的案例中的副本實際上對列表意味着什麼。你還需要列表的內容的副本嗎?對於像int這樣的值類型,它的相當簡單,如果它是參考類型,儘管....有一些問題要問你想要列表包含什麼。