Неизменяемый или не неизменяемый?

Хорошо, насколько я понимаю, неизменяемые типы по своей сути являются потокобезопасными, или я читал в разных местах, и я думаю, что поймите, почему это так. Если внутреннее состояние экземпляра не может быть изменено после создания объекта, похоже, нет проблем с одновременным доступом к самому экземпляру.

Таким образом, я мог бы создать следующий Список :

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 : IEnumerable , где T: struct быть единственным действительно рассматриваемым типом неизменяемым ?

Спасибо за любой вклад по этому вопросу.

ОБНОВЛЕНИЕ : Многие ответы / комментарии сосредоточены на конкретной реализации ImmutableList , которую я опубликовал, что, вероятно, не очень хороший пример. Но вопрос не в реализации. Вопрос, который я задаю, заключается в том, является ли ImmutableList действительно неизменяемым типом, учитывая все, что влечет за собой неизменяемый тип.

15
задан InBetween 25 January 2012 в 21:20
поделиться