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.