Хорошо, насколько я понимаю, неизменяемые типы по своей сути являются потокобезопасными, или я читал в разных местах, и я думаю, что поймите, почему это так. Если внутреннее состояние экземпляра не может быть изменено после создания объекта, похоже, нет проблем с одновременным доступом к самому экземпляру.
Таким образом, я мог бы создать следующий Список
:
class ImmutableList<T>: IEnumerable<T>
{
readonly List<T> innerList;
public ImmutableList(IEnumerable<T> collection)
{
this.innerList = new List<T>(collection);
}
public ImmutableList()
{
this.innerList = new List<T>();
}
public ImmutableList<T> Add(T item)
{
var list = new ImmutableList<T>(this.innerList);
list.innerList.Add(item);
return list;
}
public ImmutableList<T> Remove(T item)
{
var list = new ImmutableList<T>(this.innerList);
list.innerList.Remove(item);
return list;
} //and so on with relevant List methods...
public T this[int index]
{
get
{
return this.innerList[index];
}
}
public IEnumerator<T> GetEnumerator()
{
return innerList.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return ((System.Collections.IEnumerable)this.innerList).GetEnumerator();
}
}
Итак, вопрос: действительно ли этот неизменяемый тип? Это действительно потокобезопасный?
Очевидно, что сам тип неизменяемый , но нет абсолютно никакой гарантии, что T
является, и поэтому у вас могут быть проблемы одновременного доступа и потоковой передачи, связанные непосредственно с общий тип. Означает ли это, что ImmutableList
следует считать изменяемым ?.
Должен ли class ImmutableList
быть единственным действительно рассматриваемым типом неизменяемым ?
Спасибо за любой вклад по этому вопросу.
ОБНОВЛЕНИЕ : Многие ответы / комментарии сосредоточены на конкретной реализации ImmutableList
, которую я опубликовал, что, вероятно, не очень хороший пример. Но вопрос не в реализации. Вопрос, который я задаю, заключается в том, является ли ImmutableList
действительно неизменяемым типом, учитывая все, что влечет за собой неизменяемый тип.