创建列表的副本

时间:2013-10-28 08:17:49

标签: c# .net winforms

我需要存储两个变量,然后检查它们是否没有变化。

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中看到Items添加到list_catalogs_for_check_changed或list_files_check_changed。为什么???我没有用变量添加项目。

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

3 个答案:

答案 0 :(得分:6)

执行此操作时:

list_catalogs_for_check_changed = list_catalogs;

您没有复制列表,而是将新的引用分配给同一列表。如果要创建包含相同项目的新列表,请执行以下操作:

    list_catalogs_for_check_changed = new List<CatalogInfo>(list_catalogs);

这会分配一个新的List<CatalogInfo>并传递要复制元素的列表,从而产生两个具有相同项目的独立列表。

答案 1 :(得分: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相同列表的引用。因此,如果您将一个项目添加到该列表中,它将通过任一变量显示。

变量不是列表:列表位于托管堆上的某个位置。该变量只是列表中的引用。将一个列表变量分配给另一个列表变量会复制参考。它 制作列表的副本。

答案 2 :(得分:1)

当你这样做时

list_catalogs_for_check_changed = list_catalogs;

您正在将reference移交给list_catalogs。你想复制它。

This is an article describing value types vs reference