提问人:박영환 提问时间:7/11/2019 更新时间:7/11/2019 访问量:61
在 c# 中,为什么此代码通过引用工作?我打算按值使用
in c#, Why this code work as by reference? I intended to use as by value
问:
我试图将类作为历史列出。
所以一个类的列表是这样声明的。
private List<SearchHistoryItem> SearchHistoryList;
SearchHistoryItem 是一个具有两个属性的类。
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);
}
我认为没有理由通过引用复制数据。但是当这段代码运行时, List 'SearchHistoryList' 中的每个项目都具有相同的 CurrentSearchCondition 和 MainChartDataTable 值。 我检查了 我怎样才能解决这个问题,被值复制?
答:
1赞
Twometer
7/11/2019
#1
将对象(如 List)分配给变量时,将分配引用。当您对一个引用上的对象执行任何操作时,所有引用都将显示更改,因为它们只是对同一对象的引用。
您要做的是在传递列表之前复制列表,例如
tmpItem.SearchResultDataTable = new List<...>();
tmpItem.SearchResultDataTable.AddRange(MainChartDataTable);
注意:这只会创建浅拷贝,而不会创建深拷贝。如果需要深度复制,则必须单独克隆列表中的每个对象。
上一个:不一致的 null 赋值
下一个:如何在 C 中通过引用传递#
评论
tmpItem.SearchResultDataTable = MainChartDataTable;
DataTable
tmpItem.SearchResultDataTable = new ...