在 C# List<T> 实现中使用 `static readonly T[] _emptyArray = new T[0]` 作为零值

dim*_*r.d 1 c# .net-core

当我发现一些我不完全理解的东西时,我正在阅读C#.Net Core中List<T>的实现。static readonly T[] _emptyArray = new T[0]每次底层数组 ( private T[] _items) 应保持(或设置为)为空时,都会使用一个字段。例如,在采用容量参数的构造函数重载中:

 public List(int capacity) {

        /*  Checking if capacity is less then 0  */

        if (capacity == 0)
            _items = _emptyArray;
        else
            _items = new T[capacity];
    }
Run Code Online (Sandbox Code Playgroud)

这是某种内存优化模式,因为我没有看到任何其他原因可以使用它,而不是简单地将底层数组设置为新的空数组:_items = new T[0]

Mar*_*ell 5

而不是简单地设置的基本阵列到一个新的空数组:_items = new T[0]

这将分配一个新的空数组很多次很多次,这不太理想。通过拥有一个共享的“空”数组,它T每个应用程序域只执行一次。所有这些空的无意义数组都可以加起来,并对垃圾收集开销产生影响。

可能会争辩说“只是使用null”,但这将需要大量额外的null测试,注意它s_emptyArray也用作ToArray()空列表的结果。