.net C#使用泛型访问静态变量(< TElement>EmptyEnumerable.Instance)

x9ybnkn6  于 2022-12-24  发布在  .NET
关注(0)|答案(1)|浏览(135)

我正在调查以下项目的实施情况:

Enumerable.Empty<...>()

我注意到在引擎盖下它使用了这个:

public static IEnumerable<TResult> Empty<TResult>() => (IEnumerable<TResult>) EmptyEnumerable<TResult>.Instance;

其依次使用以下内容:

internal class EmptyEnumerable<TElement>
    {
        public static readonly TElement[] Instance = new TElement[0];
    }

我几乎不能理解这是如何工作的。有人能为我分解一下吗?编译器和运行时是如何处理这个的?
我想说的是,每次调用.Empty〈〉():

Enumerable.Empty<string>()
   Enumerable.Empty<int>()
   Enumerable.Empty<SomeCustomClass>()

运行时必须构造可重用的单例/持久类示例:

EmptyEnumerable<string>
   EmptyEnumerable<int>
   EmptyEnumerable<SomeCustomClass>

并且这些示例(单例)永远不会被丢弃--如果我们试图调用我们已经在.Empty〈〉()上使用过的类型之一,它们就会被重用。
对吧?还是我错过了什么?

8ehkhllq

8ehkhllq1#

这种模式主要用于缓存对象。
每次通过调用Empty属性请求一个空数组时,它总是返回相同的对象。它不会在每次使用相同的T参数调用Empty时创建新对象。
编辑:在这种情况下,它没有创建任何你的SomeCustomClass的示例,只是创建了SomeCustomClass的一个数组。泛型参数类型是否需要初始化并不重要。

相关问题