Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用'static readonly T[]\u emptyArray=new T[0]`作为C#List中的零值<;T>;实施_C#_.net Core - Fatal编程技术网

使用'static readonly T[]\u emptyArray=new T[0]`作为C#List中的零值<;T>;实施

使用'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

我在阅读C#.Net内核中的实现时,发现了一些我不完全理解的东西。有一个
静态只读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()进行额外的泛型实例化