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 });
4

3 回答 3

6

当你这样做时:

list_catalogs_for_check_changed = list_catalogs;

您不是在制作列表的副本,而是在为同一列表分配新的引用。如果要创建包含相同项目的新列表,请执行以下操作:

    list_catalogs_for_check_changed = new List<CatalogInfo>(list_catalogs);

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

于 2013-10-28T08:22:11.597 回答
3

我不使用变量添加项目。

确实,你没有。您正在向列表中添加项目。如果你这样做(来自问题):

list_catalogs_for_check_changed = list_catalogs;
list_files_check_changed = list_files;

然后两者都list_catalogs_for_check_changed持有 list_catalogs同一列表的引用CatalogInfo。同样,list_fileslist_files_check_changed持有对同一s列表的引用FileInfo。因此,如果您将一个项目添加到该列表,它将通过任一变量可见。

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

于 2013-10-28T08:21:40.497 回答
1

当你这样做

list_catalogs_for_check_changed = list_catalogs;

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

这是一篇描述值类型与参考的文章

于 2013-10-28T08:22:15.420 回答