Поделиться через


CA1871: не передайте структуру, допускаемую значение NULL, в "ArgumentNullException.ThrowIfNull"

Свойство Значение
Идентификатор правила CA1871
Заголовок Не передайте структуру, допускаемую значение NULL, в "ArgumentNullException.ThrowIfNull"
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 9 Как сведения

Причина

При передаче ArgumentNullException.ThrowIfNullв объект структуры, допускающей значение NULL, int? например или Guid?, он упаковается в объект, что приводит к штрафу производительности.

Описание правила

Для повышения производительности лучше проверка HasValue свойству и вручную вызвать исключение, чем передать структуру, допускаемую ArgumentNullException.ThrowIfNullзначение NULL.

Устранение нарушений

Проверьте значение 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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.