如何防止更改 IReadOnlyList<T>?

How to prevent changes to an IReadOnlyList<T>?

我需要使用 IReadOnlyList<T> 作为 return 参数,因为它最符合我的需要,但正如您在下面的示例中看到的,您仍然可以修改它包装的列表,如果它是不是真正的只读。

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> 看起来很棒,因为它是真正只读的,唯一的事情是我不 want/need 公开 return 允许更改的 return生成副本。

因此,我坚持使用 return IReadOnlyList<T>,因为它的意图很简单,但我需要解决可能修改的列表问题。

问题:

return将 ImmutableArray<T> 作为 IReadOnlyList<T> 是正确的方法吗?

如果没有那么你能建议怎么做吗?

这不是 IReadOnlyList 的工作方式

IReadOnlyList Interface

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.

如果你想要 Immutable Collection 查看

System.Collections.Immutable Namespace

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