CA1825:避免数组分配长度为零

属性
规则 ID CA1825
标题 避免数组分配长度为零
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用 作为建议

原因

分配了一个不包含任何元素的空 Array

规则说明

初始化长度为零的数组将导致不必要的内存分配。 请改为通过调用 Array.Empty 方法来使用静态分配的空数组实例。 内存分配在此方法的所有调用之间共享。

如何解决冲突

若要解决冲突,请将长度为零的数组分配替换为对 Array.Empty 的调用。 例如,以下两个代码片段显示了规则冲突及其解决方法:

class C
{
    public void M1()
    {
        // Violates rule CA1825.
        var a = new int[0];
    }
}
class C
{
    public void M1()
    {
        // Resolves rule CA1825 violation.
        var a = System.Array.Empty<int>();
    }
}

提示

Visual Studio 中为此规则提供了代码修补程序。 若要使用它,请将光标置于数组分配上,然后按“Ctrl+.”(句点)。 从显示的选项列表中选择“使用 Array.Empty”。

CA1825 的代码修补程序 - 使用数组为空

何时禁止显示警告

如果不在乎额外的内存分配,可禁止显示此规则的冲突。

注意

如果满足以下所有条件,你可能会看到来自此规则的误报警告:

  • 你将 Visual Studio 2022 版本 17.5 或更高版本与旧版 .NET SDK(即 .NET 6 或更低版本)配合使用。
  • 你使用的是 .NET 6 SDK 中的分析器或较旧版本的分析器包,例如 Microsoft.CodeAnalysis.FxCopAnalyzers。
  • 使用零长度数组作为属性参数,最常见的是用作 params 参数。

误报是由于 C# 编译器中的中断性变更造成的。 请考虑使用更新的包含误报警告修补程序的分析器。 升级到 Microsoft.CodeAnalysis.NetAnalyzers 版本 7.0.0-preview1.22464.1 或更高版本,或使用 .NET 7 SDK 中的分析器。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA1825
// The code that's violating the rule is on this line.
#pragma warning restore CA1825

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA1825.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

另请参阅