在 c# 中,为什么此代码通过引用工作?我打算按值使用

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

提问人:박영환 提问时间:7/11/2019 更新时间:7/11/2019 访问量:61

问:

我试图将类作为历史列出。

所以一个类的列表是这样声明的。

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 值。 我检查了 我怎样才能解决这个问题,被值复制?

C# 按引用传递

评论

2赞 MakePeaceGreatAgain 7/11/2019
好吧,只是创建另一个对完全相同的引用.当然,在一个引用上执行任何操作都会反映在所有引用中。当您想要表的独立副本时,您必须创建一个新副本:.tmpItem.SearchResultDataTable = MainChartDataTable;DataTabletmpItem.SearchResultDataTable = new ...

答:

1赞 Twometer 7/11/2019 #1

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

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

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

注意:这只会创建浅拷贝,而不会创建深拷贝。如果需要深度复制,则必须单独克隆列表中的每个对象。