Мне нужно использовать 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> правильным подходом?
Если нет, то не могли бы вы подсказать, как это сделать?
Ладно, это не тот термин, который нужно использовать!
Извините, я собираюсь отредактировать свой вопрос, потому что я забыл кое-что упомянуть.
Если вы не предоставляете исходный список, вы можете использовать метод AsReadOnly, см. docs.microsoft.com/en-us/dotnet/api/…, который создает оболочку, имеющую только методы сбора только для чтения.
@ckuri Взгляните на раздел комментариев в docs.microsoft.com/en-us/dotnet/api/…
@Aybe Вот почему я сказал: «Если вы не предоставите исходный список». Если вы сделаете new List<Section> { … }.AsReadOnly(), вы получите список только для чтения, который нельзя изменить каким-либо образом, потому что вы больше не можете получить исходный изменяемый список.
Правильно, это будет эффективно работать, спасибо!





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