C# / .NET 相当于 Java Collections.emptyList()?

发布于 2024-09-26 17:34:25 字数 242 浏览 5 评论 0原文

在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

酒解孤独 2024-10-03 17:34:25

就我个人而言,我认为这比任何其他答案都更好:

static readonly IList<T> EmptyList = new T[0];
  • 数组实现 IList
  • 您无法添加到数组。
  • 您不能分配给空数组中的元素(因为没有)。
  • 在我看来,这比 new List().AsReadOnly() 简单得多。
  • 您仍然可以返回一个 IList (如果您愿意的话)。

顺便说一句,如果我没记错的话,这就是 Enumerable.Empty() 在幕后实际使用的内容。因此,理论上您甚至可以执行 (IList)Enumerable.Empty() (尽管我认为没有充分的理由这样做)。

Personally, I think this is better than any of the other answers:

static readonly IList<T> EmptyList = new T[0];
  • Arrays implement IList<T>.
  • You cannot add to an array.
  • You cannot assign to an element in an empty array (because there is none).
  • This is, in my opinion, a lot simpler than new List<T>().AsReadOnly().
  • You still get to return an 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).

沉溺在你眼里的海 2024-10-03 17:34:25

您可以只创建一个列表:

List<MyType> list = new List<MyType>();

如果您想要一个空的 IEnumerable,请使用 Enumerable.Empty()

IEnumerable<MyType> collection = Enumerable.Empty<MyType>();

如果你确实想要一个只读列表,你可以这样做:

IList<MyType> readonlyList = (new List<MyType>()).AsReadOnly();

这会返回一个ReadOnlyCollection,它实现 IList

You can just create a list:

List<MyType> list = new List<MyType>();

If you want an empty IEnumerable<T>, use Enumerable.Empty<T>():

IEnumerable<MyType> collection = Enumerable.Empty<MyType>();

If you truly want a readonly list, you could do:

IList<MyType> readonlyList = (new List<MyType>()).AsReadOnly();

This returns a ReadOnlyCollection<T>, which implements IList<T>.

橪书 2024-10-03 17:34:25

从 .net 4.6 开始,您还可以使用:

IList<T> emptyList = Array.Empty<T>();

这只会为您指定为 T 的每个不同类型创建一个新实例一次。

Starting with .net 4.6 you can also use:

IList<T> emptyList = Array.Empty<T>();

This does only create a new instance once for every different type you specify as T.

终止放荡 2024-10-03 17:34:25
IList<T> list = new List<T>().AsReadOnly();

或者,如果您想要一个 IEnumerable

IEnumerable<T> sequence = Enumerable.Empty<T>();
IList<T> list = new List<T>().AsReadOnly();

Or, if you want an IEnumerable<>:

IEnumerable<T> sequence = Enumerable.Empty<T>();
生生漫 2024-10-03 17:34:25

如果你想要一个内容无法修改的列表,你可以这样做:

ReadOnlyCollection<Foo> foos = new List<Foo>().AsReadOnly();

If you want a list whose contents can't be modified, you can do:

ReadOnlyCollection<Foo> foos = new List<Foo>().AsReadOnly();
别低头,皇冠会掉 2024-10-03 17:34:25

构造 System.Collections.ObjectModel.ReadOnlyCollection< 的实例/a> 从你的列表中。

List<int> items = new List<int>();
ReadOnlyCollection<int> readOnlyItems = new ReadOnlyCollection<int>(items);

Construct an instance of System.Collections.ObjectModel.ReadOnlyCollection from your list.

List<int> items = new List<int>();
ReadOnlyCollection<int> readOnlyItems = new ReadOnlyCollection<int>(items);
无力看清 2024-10-03 17:34:25

为了扩展丹涛的答案,可以使用与Enumerable.Empty相同的方式使用以下实现;(),通过指定 List.Empty() 来代替。

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 字段的延迟初始化与急切初始化的讨论结果。

To expand on Dan Tao's answer, the following implementation can be used in the same way as Enumerable.Empty<T>(), by specifying List.Empty<T>() instead.

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];
    }
}

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.

随遇而安 2024-10-03 17:34:25

怎么样:

readonly List<T> mylist = new List<T>();

不确定为什么你想要它只读;不过,在我能想到的大多数情况下,这没有多大意义。

What about:

readonly List<T> mylist = new List<T>();

Not sure why you want it readonly; that doesn't make much sense in most scenarios I can think of, though.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文