Неизменяемые и замороженные коллекции в C#
Обычный список может изменить любой, у кого есть на него ссылка. Для справочника, снимка данных или набора, который читают из нескольких мест, такая правка опасна: один кусок кода добавляет элемент, другой в это время читает старый состав.
Неизменяемая коллекция сама не меняется. Операция «добавить» не трогает прежнюю версию, а возвращает новую. Старая ссылка по-прежнему видит прежние элементы. Так удобно хранить историю и передавать набор, не боясь, что получатель его перепишет.
Замороженная коллекция устроена иначе. Её один раз собирают из готовых данных и после этого только читают. Изменить её нельзя даже через новую версию. Такой словарь или набор хорош как постоянный справочник: сборка чуть дороже, чтение потом быстрее.