Обменять коллекцию защитной копией
Вот пример, который я видел в книге по эффективному 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. Это приводит к гораздо лучшей инкапсуляции.