Partilhar via


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

Property valor
ID da regra CA1870
Título Usar uma instância 'SearchValues' armazenada em cache
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Como sugestão

Motivo

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

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 armazenada em SearchValues<T> cache é mais eficiente do que passar valores para IndexOfAny ou ContainsAny diretamente.

Como corrigir violações

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

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

Exemplo

O trecho de código a seguir mostra duas violações de 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 trecho 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 deve ser reutilizado.

Quando suprimir avisos

É seguro suprimir esse aviso se o desempenho não for uma preocupação.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 para um arquivo, pasta ou projeto, defina sua severidade como none no arquivo de configuração.

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

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