Compartilhar via


CA1868: Chamada desnecessária a "Contains" para conjuntos

Property Valor
ID da regra CA1868
Título Chamada desnecessária a 'Contêineres' para conjuntos
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

Uma chamada ISet<T>.Add ou ICollection<T>.Remove é protegida por uma chamada para Contains. Ou, uma chamada 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) executam uma pesquisa, o que o torna redundante chamar ICollection<T>.Contains(T) com antecedência. É mais eficiente chamar Add(T) ou Remove(T) diretamente, o que retorna um valor booliano que indica se o item foi adicionado ou removido.

Essa logica também se aplica a IImmutableSet<T>.Add(T) e IImmutableSet<T>.Remove(T), exceto pelo fato de que eles retornam um novo conjunto se o item for adicionado ou removido, ou o conjunto original se não for.

Como corrigir violações

Substitua a chamada para ICollection<T>.Contains(T) (ou IImmutableSet<T>.Contains(T)) que é seguida por uma chamada para ISet<T>.Add(T) ou ICollection<T>.Remove(T) (ou IImmutableSet<T>.Add(T) ou IImmutableSet<T>.Remove(T)) por uma única chamada para o último método.

Exemplo

O trecho de código a seguir mostra uma violação da 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 seguinte snippet de código conserta 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 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 CA1868
// The code that's violating the rule is on this line.
#pragma warning restore CA1868

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.CA1868.severity = none

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