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

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

原因

例如 int?Guid?,将可为 null 的结构传递给 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

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