在 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,而不是深拷贝。如果您想要深拷贝,则必须单独克隆列表中的每个对象。
我正在尝试将 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,而不是深拷贝。如果您想要深拷贝,则必须单独克隆列表中的每个对象。