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.