Как предотвратить изменения в 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> правильным подходом?

Если нет, то не могли бы вы подсказать, как это сделать?

Помните, что IReadOnlyList ничего не «обертывает». Это все тот же объект списка. List реализует IReadOnlyList, и вот как вы получаете к нему доступ. Это все равно, что надеть на телефон чехол, который скрывает нижнюю половину экрана — это все тот же телефон. Я бы сказал, что ImmutableArray — это правильный подход, если вы хотите сделать больше, чем не дать людям случайно изменить список.

Llama 15.02.2019 06:15

Ладно, это не тот термин, который нужно использовать!

aybe 15.02.2019 06:18

Извините, я собираюсь отредактировать свой вопрос, потому что я забыл кое-что упомянуть.

aybe 15.02.2019 06:19

Если вы не предоставляете исходный список, вы можете использовать метод AsReadOnly, см. docs.microsoft.com/en-us/dotnet/api/…, который создает оболочку, имеющую только методы сбора только для чтения.

ckuri 15.02.2019 08:20

@ckuri Взгляните на раздел комментариев в docs.microsoft.com/en-us/dotnet/api/…

aybe 15.02.2019 19:08

@Aybe Вот почему я сказал: «Если вы не предоставите исходный список». Если вы сделаете new List<Section> { … }.AsReadOnly(), вы получите список только для чтения, который нельзя изменить каким-либо образом, потому что вы больше не можете получить исходный изменяемый список.

ckuri 15.02.2019 21:32

Правильно, это будет эффективно работать, спасибо!

aybe 15.02.2019 23:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
7
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Интерфейс IReadOnlyList

The IReadOnlyList<T> represents a list in which the number and order of list elements is read-only. The content of list elements is not guaranteed to be read-only.

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

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

The System.Collections.Immutable namespace contains interfaces and classes that define immutable collections.

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