CA1861: избегайте массивов констант в качестве аргументов

Свойство Значение
Идентификатор правила CA1861
Заголовок Избегайте массивов констант в качестве аргументов
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Константный массив литеральных значений передается методу с помощью регулярного вызова или вызова метода расширения.

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

Массивы констант, передаваемые в качестве аргументов, не используются повторно при вызове, что означает, что новый массив создается каждый раз. Если переданный массив не мутируется в вызываемом static readonly методе, рассмотрите возможность извлечения его в поле для повышения производительности.

Примечание.

Если вызывается метод мутирует переданный массив или если вы не уверены, будет ли метод мутировать массив, не извлекайте массив в static readonly поле. Это может быть критическим изменением. В этом случае лучше отключить предупреждение.

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

Извлеките массивы констант в static readonly поля, если переданный массив не мутируется в вызываемом методе.

В следующем примере показано нарушение правила:

// A method argument
string message = string.Join(" ", new[] { "Hello", "world!" });
' A method argument
Dim message As String = String.Join(" ", {"Hello", "world!"})

В следующем примере показано, как исправлено нарушение этого правила путем извлечения аргумента в static readonly поле.

private static readonly string[] array = new[] { "Hello" , "world!" };

private string GetMessage()
{
    return string.Join(" ", array);
}
Private Shared ReadOnly array As String() = {"Hello", "world!"}

Private Function GetMessage() As String
    Return String.Join(" ", array)
End Function

Теперь значение массива разрешается во время компиляции, а не во время выполнения, что делает код более производительным.

Когда лучше отключить предупреждения

Запретить нарушение этого правила, если:

  • Вызов выполняется только один раз.
  • Массив может быть мутирован в вызываемом методе или не уверен, будет ли он мутирован.
  • Вы не беспокоитесь о влиянии производительности на создание массива констант для каждого вызова.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

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

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