Подтвердить что ты не робот

Как сделать метод List Add method защищенным, пока выставляете List with get property?

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

public class WhatClass
{
    List<SomeOtherClass> _SomeOtherClassItems;

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

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

WhatClass.SomeOtherClassItems.Add(item);

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

4b9b3361

Ответ 1

Как говорили другие, вы ищете метод расширения .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 имеет значение true, что в противном случае могло бы оказаться неожиданным для пользователей API.

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

Ответ 2

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

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

Например:

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

    List<SomeOtherClass> _SomeOtherClassItems;

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

Ответ 3

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

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

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

Ответ 5

Вы можете просто использовать ToList(), чтобы вернуть копию списка. Другие классы могут делать то, что им нравится, с копией, это не изменит ваш первоначальный список.

Вы должны четко указать от имени, что они получают копию.

using System.Linq;

public class WhatClass
{
    List<SomeOtherClass> _SomeOtherClassItems;

    public List<SomeOtherClass> SomeOtherClassItems { get { return _SomeOtherClassItems.ToList(); } }
}