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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.