使用'static readonly T[]\u emptyArray=new T[0]`作为C#List中的零值<;T>;实施
我在阅读C#.Net内核中的实现时,发现了一些我不完全理解的东西。有一个使用'static readonly T[]\u emptyArray=new T[0]`作为C#List中的零值<;T>;实施,c#,.net-core,C#,.net Core,我在阅读C#.Net内核中的实现时,发现了一些我不完全理解的东西。有一个静态只读T[]\u emptyArray=new T[0]字段,每当基础数组(私有T[]\u项)保持(或设置为)空时,都会使用该字段。例如,在采用容量参数的构造函数重载中: public List(int capacity) { /* Checking if capacity is less then 0 */ if (capacity == 0) _item
静态只读T[]\u emptyArray=new T[0]
字段,每当基础数组(私有T[]\u项
)保持(或设置为)空时,都会使用该字段。例如,在采用容量参数的构造函数重载中:
public List(int capacity) {
/* Checking if capacity is less then 0 */
if (capacity == 0)
_items = _emptyArray;
else
_items = new T[capacity];
}
这是内存优化的一种模式,因为我看不出使用这种模式而不是简单地将基础数组设置为新的空数组的任何其他原因:\u items=new t[0]
不要简单地将基础数组设置为新的空数组:\u items=new T[0]
这将分配一个新的空数组很多很多很多次,这是不理想的。通过使用单个共享的“空”数组,它只在每个应用程序域中对每个T
执行一次。所有这些空的无意义数组都可能累加起来,并对垃圾收集开销产生影响
您可以争辩说“只使用null
”,但这需要大量额外的null
测试,并且注意s_emptyArray
也在ToArray()
中用作空列表的结果
不要简单地将基础数组设置为新的空数组:\u items=new T[0]
这将分配一个新的空数组很多很多很多次,这是不理想的。通过使用单个共享的“空”数组,它只在每个应用程序域中对每个T
执行一次。所有这些空的无意义数组都可能累加起来,并对垃圾收集开销产生影响
你可以争辩说“只使用
null
”,但这需要大量额外的null
测试,并注意s_emptyArray
也用于ToArray()
作为空列表的结果。注意:参考源不是最新的代码;真正的代码在这里:我想知道为什么实现要执行static readonly T[]\u emptyArray=new T[0]
而不是static readonly T[]\u emptyArray=Array.Empty()@马修沃森:这是评论!啊哈!Marc的更新包含以下答案:#pragma warning disable CA1825//避免对Array.Empty()进行额外的泛型实例化注意:引用源不是最新代码;真正的代码在这里:我想知道为什么实现要执行static readonly T[]\u emptyArray=new T[0]
而不是static readonly T[]\u emptyArray=Array.Empty()@马修沃森:这是评论!啊哈!Marc的更新包含了答案:#pragma warning disable CA1825//避免对Array.Empty()进行额外的泛型实例化