Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
| 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 10 | 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.
Está disponível uma correção de código que executa automaticamente essa transformação.
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.