Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Propriedade | valor |
|---|---|
| ID da regra | CA1868 |
| Título | Chamada desnecessária do método 'Contains' em conjuntos |
| Categoria | Desempenho |
| A correção causa interrupção ou não | Ininterrupto |
| Habilitado por padrão no .NET 10 | Como sugestão |
| Línguas aplicáveis | C# e Visual Basic |
Motivo
Uma ISet<T>.Add ou ICollection<T>.Remove chamada é protegida por uma chamada para Contains. Ou uma chamada de IImmutableSet<T>.Add ou IImmutableSet<T>.Remove é protegida por uma chamada para IImmutableSet<T>.Contains.
Descrição da regra
Ambos ISet<T>.Add(T) e ICollection<T>.Remove(T) realizam uma pesquisa, o que torna redundante chamar ICollection<T>.Contains(T) de antecipadamente. É mais eficiente chamar Add(T) ou Remove(T) diretamente, o que retorna um valor booleano indicando se o item foi adicionado ou removido.
Essa lógica também se aplica a IImmutableSet<T>.Add(T) e IImmutableSet<T>.Remove(T), exceto pelo fato de que retornam um novo conjunto se o item for adicionado ou removido, ou o conjunto original caso contrário.
Como corrigir violações
Substitua a chamada para ICollection<T>.Contains(T) (ou IImmutableSet<T>.Contains(T)) seguida por uma chamada para ISet<T>.Add(T) ou ICollection<T>.Remove(T) (ou IImmutableSet<T>.Add(T)IImmutableSet<T>.Remove(T)) por uma única chamada para o último método.
Exemplo
O seguinte trecho de código mostra uma violação de CA1868:
void Run(ISet<string> set)
{
if (!set.Contains("Hello World"))
{
set.Add("Hello World");
}
}
Sub Run(set As ISet(Of String))
If Not set.Contains("Hello World") Then
set.Add("Hello World")
End If
End Sub
O trecho de código a seguir corrige a violação:
void Run(ISet<string> set)
{
set.Add("Hello World");
}
Sub Run(set As ISet(Of String))
set.Add("Hello World")
End Sub
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 CA1868
// The code that's violating the rule is on this line.
#pragma warning restore CA1868
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1868.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.