Как предотвратить изменения в IReadOnlyList<T>?

Мне нужно использовать IReadOnlyList<T> в качестве возвращаемого параметра, поскольку он наилучшим образом соответствует моим потребностям, но, как вы можете видеть из приведенных ниже примеров, вы все равно можете изменить список, который он переносит, если он не предназначен только для чтения.

using System.Collections.Generic;
using System.Collections.Immutable;

public class Test
{
    public Test()
    {
        // return an IReadOnlyList that wraps a List, we can modify content
        var list1 = GetList1();
        if (list1 is List<Section> sections1) // can be true
        {
            sections1.Clear();
        }

        // return an IReadOnlyList that wraps an ImmutableArray, we cannot modify content
        var list2 = GetList2();
        if (list2 is List<Section> sections2) // never true
        {
            sections2.Clear();
        }
    }

    public static IReadOnlyList<Section> GetList1()
    {
        return new List<Section> {new Section()};
    }

    public static IReadOnlyList<Section> GetList2()
    {
        return ImmutableArray.Create(new Section());
    }
}

public struct Section
{
}

Проблема:

ImmutableArray<T> выглядит великолепно, так как он действительно только для чтения, единственное, что я не хочу / не должен публично возвращать тот полнофункциональный класс, который допускает изменения, производящие копию.

Я поэтому придерживаюсь, чтобы вернуться IReadOnlyList<T> поскольку его намерения просты, но мне нужно исправить проблему с изменяемым списком.

Вопрос:

Возвращается ImmutableArray<T> как IReadOnlyList<T> правильный подход?

Если нет, то можете ли вы предложить, как это сделать?

1 ответ

Решение

Это не как IReadOnlyList работает

Интерфейс IReadOnlyList

IReadOnlyList<T> представляет список, в котором количество и порядок элементов списка доступны только для чтения. Содержание элементов списка не гарантируется только для чтения.

Если вы хотите ImmutableCollection проверять, выписываться

System.Collections.Imutable Namespace

Пространство имен System.Collections.Immutable содержит интерфейсы и классы, которые определяют неизменяемые коллекции.

Другие вопросы по тегам