C# / .NET 相当于 Java Collections.emptyList()?
在 C# 中获取类型化、只读空列表的标准方法是什么?或者是否有一种方法?
预计到达时间: 对于那些问“为什么?”的人:我有一个返回 IList
的虚拟方法(或者更确切地说,后答案,一个 IEnumerable
),默认实现为空。无论列表返回什么,都应该是只读的,因为写入它会是一个错误,如果有人尝试这样做,我想立即停止并着火,而不是等待错误稍后以某种微妙的方式出现。
What's the standard way to get a typed, readonly empty list in C#, or is there one?
ETA: For those asking "why?": I have a virtual method that returns an IList
(or rather, post-answers, an IEnumerable
), and the default implementation is empty. Whatever the list returns should be readonly because writing to it would be a bug, and if somebody tries to, I want to halt and catch fire immediately, rather than wait for the bug to show up in some subtle way later.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
就我个人而言,我认为这比任何其他答案都更好:
IList
。IList
(如果您愿意的话)。顺便说一句,如果我没记错的话,这就是
Enumerable.Empty()
在幕后实际使用的内容。因此,理论上您甚至可以执行(IList)Enumerable.Empty()
(尽管我认为没有充分的理由这样做)。Personally, I think this is better than any of the other answers:
IList<T>
.new List<T>().AsReadOnly()
.IList<T>
(if you want).Incidentally, this is what
Enumerable.Empty<T>()
actually uses under the hood, if I recall correctly. So theoretically you could even do(IList<T>)Enumerable.Empty<T>()
(though I see no good reason to do that).您可以只创建一个列表:
如果您想要一个空的
IEnumerable
,请使用Enumerable.Empty()
:如果你确实想要一个只读列表,你可以这样做:
这会返回一个
ReadOnlyCollection
,它实现IList
。You can just create a list:
If you want an empty
IEnumerable<T>
, useEnumerable.Empty<T>()
:If you truly want a readonly list, you could do:
This returns a
ReadOnlyCollection<T>
, which implementsIList<T>
.从 .net 4.6 开始,您还可以使用:
这只会为您指定为 T 的每个不同类型创建一个新实例一次。
Starting with .net 4.6 you can also use:
This does only create a new instance once for every different type you specify as T.
或者,如果您想要一个
IEnumerable
:Or, if you want an
IEnumerable<>
:如果你想要一个内容无法修改的列表,你可以这样做:
If you want a list whose contents can't be modified, you can do:
构造
System.Collections.ObjectModel.ReadOnlyCollection
< 的实例/a> 从你的列表中。Construct an instance of
System.Collections.ObjectModel.ReadOnlyCollection
from your list.为了扩展丹涛的答案,可以使用与
Enumerable.Empty相同的方式使用以下实现;()
,通过指定List.Empty()
来代替。编辑:我更改了上面的代码以反映与 Dan Tao 关于
Instance
字段的延迟初始化与急切初始化的讨论结果。To expand on Dan Tao's answer, the following implementation can be used in the same way as
Enumerable.Empty<T>()
, by specifyingList.Empty<T>()
instead.Edit: I change the above code to reflect the outcome of a discussion with Dan Tao about lazy versus eager initialization of the
Instance
field.怎么样:
不确定为什么你想要它只读;不过,在我能想到的大多数情况下,这没有多大意义。
What about:
Not sure why you want it readonly; that doesn't make much sense in most scenarios I can think of, though.