在 C# 中,为什么这段代码按引用工作?我打算按价值使用

in c#, Why this code work as by reference? I intended to use as by value

我正在尝试将 class 列为历史记录。

所以 class 的列表是这样声明的。

private List<SearchHistoryItem> SearchHistoryList;

SearchHistoryItem 是一个 class,它有两个 属性。

public DataTable SearchResultDataTable;
public SearchCondition SearchCondition; // this is another class.

每当调用此方法时,我都会创建临时 'SearchHistoryItem',从当前实例复制并添加到列表中。

public void GetMainDataAsConditionMethod()
{
    SearchHistoryItem tmpItem = new SearchHistoryItem();
    tmpItem.SearchCondition = CurrentSearchCondition;
    tmpItem.SearchResultDataTable = MainChartDataTable;

    SearchHistoryList.Add(tmpItem);
}

我认为没有理由通过引用复制数据。但是当这段代码为运行时, 列表 'SearchHistoryList' 中的每个项目都具有相同的 CurrentSearchCondition 和 MainChartDataTable 值。 我检查了 我该如何解决这个按值复制?

当您将对象(例如列表)分配给变量时,您分配了一个引用。当您对一个引用上的对象执行任何操作时,所有引用都会显示更改,因为它们只是对同一对象的 引用

你要做的是在传递之前复制列表,例如

tmpItem.SearchResultDataTable = new List<...>();
tmpItem.SearchResultDataTable.AddRange(MainChartDataTable);

注意:这只会创建一个 shallow copy,而不是深拷贝。如果您想要深拷贝,则必须单独克隆列表中的每个对象。