обменять коллекцию защитной копией - PullRequest
0 голосов
/ 24 августа 2011

Это пример, который я видел в книге Effective 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;
}

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

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

верно?

1 Ответ

0 голосов
/ 24 августа 2011

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

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

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

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

...