创建列表的副本

本文关键字:副本 列表 创建 | 更新日期: 2023-09-27 18:37:16

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

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

创建列表的副本

当你这样做时:

list_catalogs_for_check_changed = list_catalogs;

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

    list_catalogs_for_check_changed = new List<CatalogInfo>(list_catalogs);

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

我不添加带有变量的项目。

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

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 列表的引用。因此,如果您将项目添加到该列表,它将通过任一变量可见。

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

当你这样做时

list_catalogs_for_check_changed = list_catalogs;

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

这是一篇描述值类型与引用的文章