我正在经过Jon Skeet的Edulinq,我遇到了以下代码,第23页,他Empty()为Linq的运营商实现了缓存机制
private static class EmptyHolder<T>
{
internal static readonly T[] Array = new T[0];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这实际上如何缓存Array变量?
(可选)如何在CLR中运行?
编辑:此后,他提到有一个反对返回数组的反抗.为什么有人不返回一个数组(即使它是0大小?)?
Jon*_*eet 14
我的问题是,这实际上如何缓存Array变量?
CLR按类型参数缓存它.基本上,EmptyHolder<int>是一个不同的类型EmptyHolder<string>,并且每个具体类型调用类型初始化程序(由CLR自动调用).
所以:
var x = EmptyHolder<string>.Array; // Needs to construct the empty string[] array
var y = EmptyHolder<string>.Array; // No extra work! x and y have the same value
var z = EmptyHolder<int>.Array; // This constructs an empty array for int[]
Run Code Online (Sandbox Code Playgroud)
(可选)如何在CLR中运行?
这是一个我不太了解的实现细节,我很害怕.但基本上这都是关于CLR如何做的事:)
编辑:此后,他提到有一个反对返回数组的反抗.为什么有人不返回一个数组(即使它是0大小?)?
好吧,有评论:
数组方法不是很好:人们将错误地依赖返回值作为数组,尽管没有记录.
我个人认为这不是问题,但编写替代实现很有趣:)