Как войти в Список, Добавляет защищенный метод, в то время как представление Списка с получает свойство?

У меня есть класс под названием WhatClass, который имеет поле List в нем. Я должен смочь к только для чтения это поле, таким образом, я использовал получить свойство для представления его другим объектам.

public class WhatClass
{
    List<SomeOtherClass> _SomeOtherClassItems;

    public List<SomeOtherClass> SomeOtherClassItems { get { return _SomeOtherClassItems; } }
}

Однако оказывается, что любой объект может звонить

WhatClass.SomeOtherClassItems.Add(item);

Как я могу предотвратить это?

19
задан Nikola Malešević 15 July 2010 в 22:44
поделиться

4 ответа

Как уже сказали другие, вам нужен метод расширения .AsReadOnly().

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

private readonly List<SomeOtherClass> _items;

public WhatClass()
{
    _items = new List<SomeOtherClass>();

    this.Items = _items.AsReadOnly();
}

public ReadOnlyCollection<SomeOtherClass> Items { get; private set; }

Это необходимо для того, чтобы гарантировать, что x.Items == x.Items будет истинным, что в противном случае может быть очень неожиданным для потребителей API.

Выставление ReadOnlyCollection<> передает потребителям ваше намерение создать коллекцию только для чтения. Изменения в _items будут отражены в Items.

27
ответ дан 30 November 2019 в 03:02
поделиться

Вы ищете ReadOnlyCollection класс , который является оболочкой только для чтения вокруг IList .

Поскольку ReadOnlyCollection будет отражать изменения в базовом списке, вам не нужно каждый раз создавать новый экземпляр.

Например:

public class WhatClass {
    public WhatClass() {
        _SomeOtherClassItems = new List<SomeOtherClass>();
        SomeOtherClassItems = _SomeOtherClassItems.AsReadOnly();
    }

    List<SomeOtherClass> _SomeOtherClassItems;

    public ReadOnlyCollection<SomeOtherClass> SomeOtherClassItems { get; private set; }
}
8
ответ дан 30 November 2019 в 03:02
поделиться

Используйте List .AsReadOnly :

public ReadOnlyCollection<SomeOtherClass> SomeOtherClassItems
{
    get
    {
        return _SomeOtherClassItems.AsReadOnly();
    }
}

Это вернет ReadOnlyCollection , который будет генерировать исключение, если клиент вызывает Add через интерфейс. Кроме того, тип ReadOnlyCollection не предоставляет общедоступный метод Add.

6
ответ дан 30 November 2019 в 03:02
поделиться

Как насчет использования AsReadOnly () ? - Документация MSDN

3
ответ дан 30 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

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