Как предотвратить изменения в IReadOnlyList <T>? - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужно использовать 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 Ответ

0 голосов
/ 15 февраля 2019

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

Интерфейс IReadOnlyList

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

Если вы хотите Immutable Collection проверить

Пространство имен System.Collections.Immutable

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

...