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


CA1870: использование кэшированного экземпляра SearchValues

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

Причина

Вместо IndexOfAny этого вызывается метод ContainsAny с большим количеством константных значений SearchValues .

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

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

Использование кэшированного экземпляра SearchValues<T> является более эффективным, чем передача значений в IndexOfAny или ContainsAny напрямую.

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

Создайте и кэшируйте SearchValues<T> экземпляр в static readonly поле, а затем передайте этот экземпляр IndexOfAny в или ContainsAny вызов.

Доступен средство исправления кода, выполняющее это преобразование.

Пример

В следующем фрагменте кода показаны два нарушения CA1870:

static readonly char[] MyValues = new[] { 'a', 'b', 'c', 'x', 'y', 'z' };

static int IndexOfMyValues(ReadOnlySpan<char> text)
{
    return text.IndexOfAny(MyValues);
}

static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
    return !text.ContainsAnyExcept("abcxyz");
}

Следующий фрагмент кода исправляет нарушения.

private static readonly SearchValues<char> s_myValues = SearchValues.Create("abcxyz");

static int IndexOfMyValues(ReadOnlySpan<char> text)
{
    return text.IndexOfAny(s_myValues);
}

static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
    return !text.ContainsAnyExcept(s_myValues);
}

Если имеется несколько вызовов IndexOfAny с одинаковым набором значений, s_myValues следует повторно использовать.

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

Это предупреждение безопасно подавлять, если производительность не является проблемой.

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

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

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

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

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

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