在C#中获取类型化的,只读的空列表的标准方法是什么,或者有一个?
ETA:对于那些问“为什么?”的人:我有一个虚拟方法返回IList
(或更确切地说,回复后,IEnumerable
),以及默认实现为空。无论列表返回什么都应该是readonly因为写入它将是一个bug,如果有人试图,我想立即停止并着火,而不是等待bug稍后以某种微妙的方式出现。
答案 0 :(得分:24)
就我个人而言,我认为这比任何其他答案都要好:
static readonly IList<T> EmptyList = new T[0];
IList<T>
。new List<T>().AsReadOnly()
简单得多。 IList<T>
(如果您愿意)。顺便说一下,如果我没记错的话,这就是Enumerable.Empty<T>()
实际使用的内容。所以理论上你甚至可以(IList<T>)Enumerable.Empty<T>()
(尽管我没有理由这样做)。
答案 1 :(得分:22)
您只需创建一个列表:
List<MyType> list = new List<MyType>();
如果您想要空IEnumerable<T>
,请使用Enumerable.Empty<T>()
:
IEnumerable<MyType> collection = Enumerable.Empty<MyType>();
如果你真的想要只读列表,你可以这样做:
IList<MyType> readonlyList = (new List<MyType>()).AsReadOnly();
这会返回ReadOnlyCollection<T>
,它会实现IList<T>
。
答案 2 :(得分:7)
IList<T> list = new List<T>().AsReadOnly();
或者,如果您想要IEnumerable<>
:
IEnumerable<T> sequence = Enumerable.Empty<T>();
答案 3 :(得分:6)
从.net 4.6开始,您也可以使用:
IList<T> emptyList = Array.Empty<T>();
这只为您指定为T的每种不同类型创建一个新实例。
答案 4 :(得分:4)
如果您想要一个无法修改其内容的列表,您可以执行以下操作:
ReadOnlyCollection<Foo> foos = new List<Foo>().AsReadOnly();
答案 5 :(得分:2)
从列表中构建System.Collections.ObjectModel.ReadOnlyCollection
的实例。
List<int> items = new List<int>();
ReadOnlyCollection<int> readOnlyItems = new ReadOnlyCollection<int>(items);
答案 6 :(得分:2)
要展开Dan Tao's answer,通过指定Enumerable.Empty<T>()
,可以采用与List.Empty<T>()
相同的方式使用以下实现。
public static class List
{
public static IList<T> Empty<T>()
{
// Note that the static type is only instantiated when
// it is needed, and only then is the T[0] object created, once.
return EmptyArray<T>.Instance;
}
private sealed class EmptyArray<T>
{
public static readonly T[] Instance = new T[0];
}
}
编辑:我更改了上面的代码,以反映与Dan Tao讨论Instance
字段的懒惰与急切初始化的结果。
答案 7 :(得分:-1)
怎么样:
readonly List<T> mylist = new List<T>();
不确定为什么要只读它;但是,在我能想到的大多数情况下,这都没有多大意义。