我需要使用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>
看起来很不错,因为它确实是只读的,唯一的事情是我不想/不需要公开返回fully-featured class,它允许更改以产生副本。
因此,我坚持返回IReadOnlyList<T>
,因为它的意图很简单,但我需要解决可能是可修改的列表问题。
问题:
将ImmutableArray<T>
作为IReadOnlyList<T>
返回是正确的方法吗?
如果不是,那么您可以建议如何做吗?
答案 0 :(得分:3)
这不是IReadOnlyList
的工作方式
IReadOnlyList<T>
代表一个列表,其中的数字和顺序 列表元素是只读的。 列表元素的内容不是 保证为只读。
如果您想Immutable
Collection
退房
System.Collections.Immutable Namespace
System.Collections.Immutable命名空间包含接口和 定义不可变集合的类。