Подтвердить что ты не робот

Зачем использовать ImmutableList над ReadOnlyCollection?

.NET 4.5 имеет новое пространство имен System.Collections.Immutable

Этот пакет предоставляет коллекции, которые являются потокобезопасными и гарантированно никогда не изменят их содержимое, также известное как неизменные коллекции.

Я в замешательстве. Не проблема безопасности потока уже решена классом ReadOnlyCollection? Зачем использовать ImmutableList вместо этого?


Я также знаю интерфейс IReadOnlyList. Это не устраняет проблему безопасности потока неявно, потому что другие потоки могут редактировать объект другим интерфейсом.

4b9b3361

Ответ 1

С ReadOnlyCollection:

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

Это не может произойти с ImmutableList.

Ответ 2

ReadOnlyCollection<T> не решает ни одной из проблем безопасности потока. Это всего лишь обертка вокруг Ilist<T>. Он не предоставляет членам изменять коллекцию, но вы всегда можете изменить ее с помощью ссылки на базовую коллекцию.

Если базовая коллекция изменена, небезопасно перечислять ReadOnlyCollection<T>. Если вы это сделаете, вы получите тот же InvalidOperationException с сообщением "Collection был изменен, операция перечисления может не выполняться...".

Из ReadOnlyCollection<T>

ReadOnlyCollection может поддерживать несколько считывателей одновременно, поскольку поскольку сбор не изменяется. Тем не менее, перечисление через сбор по существу не является потокобезопасной процедурой. Гарантировать безопасность потока во время перечисления, вы можете заблокировать сбор во время все перечисление. Чтобы доступ к коллекции можно получить с помощью несколько потоков для чтения и письма, вы должны реализовать свои собственные синхронизации.

ImmutableList, с другой стороны, является неизменным и, следовательно, по своей сути является безопасным потоком.

Ответ 3

ReadOnlyCollection, как следует из названия, может быть прочитан только.

С другой стороны, вы можете добавлять/удалять элементы в/из ImmutableList, вызывая, например, методы Add/Remove/Clear, которые возвращают новый неизменяемый список.