CA1870: Usar uma instância 'SearchValues' armazenada em cache

Propriedade Valor
ID da regra CA1870
Título Usar uma instância 'SearchValues' armazenada em cache
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

Um método IndexOfAny ou ContainsAny é chamado com muitos valores constantes de uma maneira que pode se beneficiar do uso de SearchValues.

A regra não sinaliza chamadas que usam até cinco valores, pois elas já usam uma implementação ideal.

Descrição da regra

Usar uma instância de SearchValues<T> armazenada em cache é mais eficiente do que passar valores para IndexOfAny ou ContainsAny diretamente.

Como corrigir violações

Crie e armazene em cache uma instância de SearchValues<T> em um campo de static readonly e, em seguida, passe essa instância para a chamada IndexOfAny ou ContainsAny.

Um reparador de código que executa essa transformação está disponível.

Exemplo

O snippet de código a seguir mostra duas violações da 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");
}

O snippet de código a seguir corrige as violações:

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);
}

Se houver várias chamadas para IndexOfAny com o mesmo conjunto de valores, s_myValues deverá ser reutilizado.

Quando suprimir avisos

É seguro fechar esse aviso se o desempenho não é uma preocupação.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira Como suprimir avisos de análise de código.