24

Вопрос по c#, list – Ключевое слово readonly не создает список <> ReadOnly?

У меня есть следующий код в публичном статическом классе:

public static class MyList
{
    public static readonly SortedList<int, List<myObj>> CharList;
    // ...etc.
}

.. но даже используяreadonly Я все еще могу добавлять элементы в список из другого класса:

MyList.CharList[100] = new List<myObj>() { new myObj(30, 30) };

или же

MyList.CharList.Add(new List<myObj>() { new myObj(30, 30) });

Есть ли способ сделать вещь доступной только для чтения, не меняя реализацию CharList (это сломает некоторые вещи)? Если бы мне пришлось изменить реализацию (чтобы сделать ее неизменной), что было бы лучшим способом? Мне нужно, чтобы он был List & lt; T, T & gt ;, поэтому ReadOnlyCollection не сможет это сделать

  • Да. Как подсказано в ответе на этот вопрос, как выясняется, в .NET 4.5 естьReadOnlyDictionary уже. Здорово.

    от
  • Я не имел, но сделал сейчас.

    от
  • См. Добавленную мной ссылку & quot; Есть ли в .NET общий словарь только для чтения? & Quot;

    от
  • @hvd: Хорошая находка, я пропустил это. Вы проголосовали за это? Чем больше у него голосов, тем больше вероятность того, что люди это увидят.

    от
  • Вопрос упоминает «Мне нужно, чтобы он был List & lt; T, T & gt ;, так что ReadOnlyCollection не будет делать», а нетReadOnlyDictionary что я в курсе.

    от
  • Возвращает коллекцию ReadOnlyCollection & lt; T & gt;

    от
  • НоSortedList<TKey, TValue> не.

    от
  • ВернутьList(Of T).AsReadOnly

    от Rango
  • 1

    Список имеет

    AsReadOnly метод, который возвращает список только для чтения, должен быть тем, что вы хотите.

  • 41

    Модификатор

    readonly означает, что значение не может бытьassigned кроме как в объявлении или конструкторе. Оно делаетnot означает, что назначенный объект становится неизменным.

    Если вы хотите, чтобы ваш объект был неизменным, вы должны использовать неизменяемый тип. ТипReadOnlyCollection<T> то, что вы упомянули, является примером неизменной коллекции. Посмотрите этот связанный вопрос о том, как добиться того же для словарей:

    Is there a read-only generic dictionary available in .NET?

  • 3

    Модификатор только для чтения гарантирует

    что переменная «CharList» не может быть переназначен чему-либо извне конструктора класса. Вам необходимо создать собственную структуру словаря, в которой нет открытого метода Add ().

    class ImmutableSortedList<T, T1> 
    {
        SortedList<T, T1> mSortedList;
    
        public ImmutableSortedList(SortedList<T, T1> sortedList) // can only add here (immutable)
        {
            this.mSortedList = sortedList; 
        }
    
        public implicit operator ImmutableSortedList<T, T1>(SortedList<T, T1> sortedList)
        {
            return new ImmutableSortedList<T, T1>(sortedList); 
        }
    }
    

    Или, если вы действительно не можете изменить реализацию, сделайте SortedList закрытым и добавьте свои собственные методы, которые контролируют доступ к нему:

    class MyList
    {
        // private now
        readonly SortedList<int, List<myObj>> CharList;
    
        // public indexer
        public List<myObj> this[int index]
        {
            get { return this.CharList[index]; }
        }
    }