c# - new object[] {} 与 Array.Empty<object>()

标签 c# arrays

当我输入以下代码时:

object[] objects = new object[] { };

Visual Studio 告诉我:

Avoid unnecessary zero-length allocations. Use Array.Empty<object>() instead.

使用一个而不是另一个有什么实际意义吗?

警告的原因是什么?

最佳答案

您正在创建一个空数组。它将始终为空,因为您无法更改数组实例的容量(说您无法更改其长度 听起来很奇怪,我不知道为什么)。每次执行此操作时,都会创建另一个永远无法使用的数组实例。经常这样做可能会导致 GC 浪费和内存压力,因此会出现警告。

不用创建空数组,只需使用 Array.Empty<T>()正如它所暗示的那样。此方法使用此静态类返回一个数组

internal static class EmptyArray<T>
{
    public readonly static T[] Value;

    static EmptyArray()
    {
        EmptyArray<T>.Value = new T[0];
    }
}

因为它是 staticreadonly ,整个应用程序域中只有一个此空数组的实例。空数组本质上是不可变的,因此缓存实例不是问题。如果您发现自己正在注视一条创建大量空数组的优雅代码路径,它允许您放弃在算法中创建特殊外壳的空数组。

Enumerable.Empty<T>()是 Linq to Objects 的等价物,对于不浪费空东西的分配也很有用。

关于c# - new object[] {} 与 Array.Empty<object>(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53071157/

相关文章:

c# - 如何使用新的 CodeModule 从模板复制 ExcelWorkSheet

VB.NET - 如何在条件中使用数组文字?

arrays - Array .push 在每个循环内返回用相同对象填充的数组

c# - 在 .net core 3.1 控制台应用程序中将 nlog 与 ApplicationInsightsTelemetryWorkerService 结合使用

c# - 用于用户运行时报告设计的 OpenSource Report Designer?

c# - 动态 LINQ

python - 无需 for 循环即可对数组元素进行运算

arrays - 如何有效地找到二维数组中的区域?

ios - 如何存储字符串和相应的标签?

c# - 为什么这个循环不规范化我的 Vector2 列表?