我正在调查以下项目的实施情况:
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〈〉()上使用过的类型之一,它们就会被重用。
对吧?还是我错过了什么?
1条答案
按热度按时间8ehkhllq1#
这种模式主要用于缓存对象。
每次通过调用
Empty
属性请求一个空数组时,它总是返回相同的对象。它不会在每次使用相同的T
参数调用Empty
时创建新对象。编辑:在这种情况下,它没有创建任何你的SomeCustomClass的示例,只是创建了SomeCustomClass的一个数组。泛型参数类型是否需要初始化并不重要。