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

24

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

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 не сможет это сделать

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

Ваш Ответ

3   ответа
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]; }
    }
}
41

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

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

Is there a read-only generic dictionary available in .NET?
Вопрос упоминает «Мне нужно, чтобы он был List & lt; T, T & gt ;, так что ReadOnlyCollection не будет делать», а нетReadOnlyDictionary что я в курсе.
@hvd: Хорошая находка, я пропустил это. Вы проголосовали за это? Чем больше у него голосов, тем больше вероятность того, что люди это увидят.
См. Добавленную мной ссылку & quot; Есть ли в .NET общий словарь только для чтения? & Quot;
Я не имел, но сделал сейчас.
Да. Как подсказано в ответе на этот вопрос, как выясняется, в .NET 4.5 естьReadOnlyDictionary уже. Здорово.
1

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

Возвращает коллекцию ReadOnlyCollection & lt; T & gt;
НоSortedList<TKey, TValue> не.

Похожие вопросы