CA1871:不要将可为 null 的结构传递给“ArgumentNullException.ThrowIfNull”

财产 价值
规则 ID CA1871
标题 不要将可为 null 的结构传递给“ArgumentNullException.ThrowIfNull”
类别 性能
修复是中断修复还是非中断修复 非中断
默认情况下,在 .NET 9 中启用 作为信息

原因

当可为 null 的结构(例如,int?Guid?)被传递给 ArgumentNullException.ThrowIfNull 时,它会被转换为对象类型,这导致性能下降。

规则说明

为了提高性能,最好检查 HasValue 属性并手动引发异常,而不是将可为 null 的结构传递给 ArgumentNullException.ThrowIfNull

如何解决违规

检查是否为 null 并手动抛出 ArgumentNullException

以下代码片段显示了对 CA1871 的违反:

static void Print(int? value)
{
    ArgumentNullException.ThrowIfNull(value);
    Console.WriteLine(value.Value);
}

以下代码片段修复了冲突:

static void Print(int? value)
{
    if (!value.HasValue)
    {
        throw new ArgumentNullException(nameof(value));
    }

    Console.WriteLine(value.Value);
}

何时禁止显示警告

如果性能不是一个主要问题,可以放心抑制此警告。

禁止显示警告

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

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

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

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

有关详细信息,请参阅 如何取消代码分析警告