Если внутреннее состояние экземпляра не может быть изменено после создания объекта, похоже, что нет проблем с одновременным доступом к самому экземпляру.
Как правило, это так, да.
Это действительно неизменный тип?
Вкратце: у вас есть оболочка для копирования при записи вокруг изменяемого списка.Добавление нового члена в неизменяемый список не изменяет список;вместо этого он создает копию основного изменяемого списка, добавляет к копии и возвращает оболочку вокруг копии.
При условии, что базовый объект списка, который вы переносите, не изменяет свое внутреннее состояние при чтении из него, вы встретили свое первоначальное определение «неизменяемого», так что да.
Замечу, что это не очень эффективный способ реализации неизменяемого списка.Например, вы бы лучше справились с неизменным сбалансированным бинарным деревом.Ваш набросок O (n) во времени и памяти каждый раз, когда вы создаете новый список;Вы можете улучшить это до O (log n) без особых затруднений.
Действительно ли это потокобезопасно?
При условии, что основной изменяемый список является поточно-ориентированным для нескольких читателей, да.
Это может вас заинтересовать:
http://blogs.msdn.com/b/ericlippert/archive/2011/05/23/read-only-and-threadsafe-are-different.aspx
Очевидно, что сам тип является неизменяемым, но нет абсолютно никакой гарантии, что Tи, следовательно, могут возникнуть проблемы с параллельным доступом и потоками, связанные непосредственно с универсальным типом.Значит ли это, что ImmutableList<T>
следует считать изменчивым?
Это философский вопрос, а не технический.Если у вас есть неизменный список имен людей, и этот список никогда не меняется, но один из людей умирает, был ли список имен «изменяемым»?Я бы подумал, что нет.
Список является неизменным, если любой вопрос о списке всегда имеет одинаковый ответ.В нашем списке имен людей "сколько имен в списке?"это вопрос по списку."Сколько из этих людей живы?"это не вопрос о списке, это вопрос о людях, упомянутых в списке.Ответ на этот вопрос со временем меняется;ответ на первый вопрос - нет.
Должен ли класс ImmutableList<T>: IEnumerable<T> where T: struct
быть единственным типом, который действительно считается неизменным?
Я не следую за вами.Как ограничение T быть структурой меняет что-либо?Хорошо, T ограничен структурой.Я делаю неизменную структуру:
struct S
{
public int[] MutableArray { get; private set; }
...
}
И теперь я делаю ImmutableList<S>
.Что мешает мне изменить изменяемый массив, хранящийся в экземплярах S?Тот факт, что список неизменен, а структура неизменна, не делает массив неизменным.