в C #, почему этот код работает как по ссылке? Я намеревался использовать как по значению - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь составить список классов как историю.

Итак, список классов был объявлен следующим образом.

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

Я думаю, что нет причин копировать данныепо ссылке.Но когда этот код выполняется, все элементы в списке «SearchHistoryList» имеют одинаковые значения CurrentSearchCondition и MainChartDataTable.Я проверил, как я могу решить это для копирования по значению?

1 Ответ

0 голосов
/ 11 июля 2019

Когда вы назначаете объект (например, список) переменной, вы назначаете ссылку. Когда вы делаете что-либо с объектом по одной ссылке, все ссылки будут показывать изменение, потому что они просто ссылки на один и тот же объект.

То, что вы хотите сделать, это скопировать список перед его передачей, например

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

Примечание. При этом создается только поверхностная копия , а не глубокая копия. Если вам нужна глубокая копия, придется клонировать каждый объект в списке по отдельности.

...