Хорошо, как я понимаю, неизменяемые типы по сути являются потокобезопасными или поэтому я читал в разных местах, и я думаю, что понимаю, почему это так. Если внутреннее состояние экземпляра не может быть изменено после создания объекта, похоже, нет проблем с одновременным доступом к самому экземпляру.
Поэтому я мог бы создать следующий List
:
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<T>: IEnumerable<T> where T: struct
быть единственным типом, который действительно считается неизменяемым?
Спасибо за любой вклад в эту проблему.
ОБНОВЛЕНИЕ. Большое количество ответов/комментариев сосредоточено на конкретной реализации ImmutableList
, которую я опубликовал, что, вероятно, не очень хороший пример. Но вопрос вопроса заключается не в реализации. Вопрос, который я задаю, заключается в том, что ImmutableList<MutableT>
действительно является неизменным типом, учитывая все, что влечет за собой неизменный тип.