Обменять коллекцию защитной копией

Вот пример, который я видел в книге по эффективному C#:

private BindingList<PayrollData> data; 
public IBindingList MyCollection 
{
get { return data; } 
}
public void UpdateData() 
{
// Unreliable operation might fail: 
var temp = UnreliableOperation();
// This operation will only happen if 
// UnreliableOperation does not throw an 
// exception. 
data = temp;
}

Автор говорит, что это будет работать для типа значения, а не для ссылочного типа. Я не мог понять, что он имел в виду.

Я думаю, что теперь я понимаю: коллекция относится к типу ссылок. потребители "поля данных" не будут помнить, что они хранят копию в старом хранилище в куче. если "данные" были типом значения - потребители (другой код, который использует данные) будут помнить, что они хранят глубокую копию данных, и будут запрашивать их снова, когда потребуется обновление.

право?

1 ответ

Решение

Коллекция является ссылочным типом, поэтому другой удерживающий код будет видеть старые данные.

Два возможных решения:

Вместо data = temp используйте data.Clear(); data.AddRange(temp), который изменит содержимое поля данных.

Или лучше удалите свойство MyCollection и заставьте класс реализовать IEnumerable. Это приводит к гораздо лучшей инкапсуляции.

Другие вопросы по тегам