2012-06-28 3 views
2

У меня есть переменная-член, которая является списком ссылочных типов. В методе, который я создаю, и элемент, добавьте его в список. Затем элемент обновляется, указывая на другой экземпляр, но экземпляр в списке не обновляется (его в одном модульном тестовом коде). Пример выглядит так:Изменение элемента после добавления в список не обновляется Список

Item localItem = new Item(arg1, arg2); 
this.itemList.Add(localItem); 

// Do some testing and assertions 

localItem = new Item(arg3, arg4); // This does not update the instance of 
            // localItem in this.ItemList 

// Do some more testing and assertions 

Я могу обновить свои тесты, чтобы исправить это, но это все еще застало меня врасплох. Я полагаю, что List хочет сохранить исходный экземпляр, прошедший через метод Add, и не заботится об этом, если локальная переменная, которая была использована для его передачи, теперь указывает на что-то еще. Может кто-нибудь может подтвердить это понимание или объяснить это более четко?

+0

Вы устанавливаете переменную 'localItem', и тем самым теряя старую ссылку на оригинальный' localItem'. Это никоим образом не влияет на 'this.itemList'. – TheZ

ответ

6

Конечно, нет. localItem является ссылкой на фактический объект (а не сам объект). Список также содержит ссылку на этот же объект. Если вы назначили другой элемент localItem, он теперь указывает на другой объект, но в списке все еще есть ссылка на старый объект.

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

public class ItemReference 
{ 
    public Item Item { get; set; } 
} 

Теперь вы можете создать локальный элемент, как это

ItemReference itemRef = new ItemReference(); 
itemRef.Item = new Item(arg1, arg2); 

this.itemReferenceList.Add(itemRef); 
itemRef.Item = new Item(arg3, arg4); 

поскольку список теперь имеет ссылку на тот же (без изменений) itemRef он «видит» новый элемент, а также.

Список должен быть объявлен как

List<ItemReference> itemReferenceList; 
+0

Это именно то, что я хотел бы порекомендовать. +1 –

3

При добавлении localItem в список добавление ссылки на экземпляр объекта (при условии, Item типа ссылки аки в class) - когда вы впоследствии создать новый Item экземпляр результатом является новой ссылкой (аналогично указателю) - если вы хотите обновить список, вам нужно удалить старый элемент и добавить новый элемент - это два совершенно разных экземпляра. В качестве альтернативы вы можете изменить любые свойства на localItem, и они будут отображаться при доступе к элементу через список.

Смежные вопросы