2013-10-28 93 views
3

我需要存儲兩個變量,然後檢查它們是否沒有更改。創建列表副本

List<CatalogInfo> list_catalogs = new List<CatalogInfo>(); 
List<FileInfo> list_files = new List<FileInfo>(); 
List<CatalogInfo> list_catalogs_for_check_changed = new List<CatalogInfo>(); 
List<FileInfo> list_files_check_changed = new List<FileInfo>(); 

當我這樣做:

list_catalogs_for_check_changed = list_catalogs; 
list_files_check_changed = list_files; 

但是當我加入list_catalogs或list_files項目我debager條件的項目添加到list_catalogs_for_check_changed或list_files_check_changed看到。爲什麼???我不添加項目與變量。

list_catalogs.Add(new CatalogInfo() { Action = "Create", Path = folderBrowserDialog1.SelectedPath }); 
+2

您需要了解值類型和引用類型之間的區別。 http://www.albahari.com/valuevsreftypes.aspx –

+0

[C#中的深層克隆對象]的可能重複(http://stackoverflow.com/questions/78536/deep-cloning-objects-in-c-sharp) –

+0

@HenkHolterman這個問題有類似的答案,但不完全相同的問題。 –

回答

3

我不變量,將項目添加到。

確實,你沒有。您正在將項目添加到列表。如果(從問題)做:

list_catalogs_for_check_changed = list_catalogs; 
list_files_check_changed = list_files; 

然後,兩個list_catalogs_for_check_changedlist_catalogs地堅持CatalogInfo相同列表的引用。同樣,list_fileslist_files_check_changed持有對的相同列表FileInfo s。因此,如果你將一個項目添加到該列表中,它將通過任一變量可見。

該變量不是列表:該列表位於託管堆上的某處。該變量只是參考到列表中。將一個列表變量分配給另一個列表變量複製參考。它確實不是複製列表

6

當你這樣做:

list_catalogs_for_check_changed = list_catalogs; 

您還沒有上榜的副本,你分配一個新的參考相同的列表。如果你想創建一個相同的項目一個新的列表,這樣做:

list_catalogs_for_check_changed = new List<CatalogInfo>(list_catalogs); 

這就賦予了新List<CatalogInfo>並將從中複製的元素,導致與同一項目兩個獨立的名單列表。