4

我需要将其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>正确的方法吗?

如果没有,那么你能建议如何去做吗?

4

1 回答 1

3

这不是IReadOnlyList工作方式

IReadOnlyList 接口

表示一个列表,其中列表元素的IReadOnlyList<T>数量和顺序是只读的。列表元素的内容不保证是只读的

如果你想Immutable Collection退房

System.Collections.Immutable 命名空间

System.Collections.Immutable 命名空间包含定义不可变集合的接口和类。

于 2019-02-15T05:18:08.807 回答