CA1868: chiamata non necessaria a 'Contains' per i set

Proprietà valore
ID regola CA1868
Title Chiamata non necessaria a 'Contains' per i set
Categoria Prestazioni
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Una ISet<T>.Add chiamata o ICollection<T>.Remove viene sorvegliata da una chiamata a Contains. In alternativa, una IImmutableSet<T>.Add chiamata o IImmutableSet<T>.Remove viene sorvegliata da una chiamata a IImmutableSet<T>.Contains.

Descrizione regola

Sia ISet<T>.Add(T) che eseguono ICollection<T>.Remove(T) una ricerca, che lo rende ridondante per chiamare ICollection<T>.Contains(T) in anticipo. È più efficiente chiamare Add(T) o Remove(T) direttamente, che restituisce un valore booleano che indica se l'elemento è stato aggiunto o rimosso.

Questa logica si applica anche a IImmutableSet<T>.Add(T) e IImmutableSet<T>.Remove(T), ad eccezione del fatto che restituiscono un nuovo set se l'elemento viene aggiunto o rimosso o se il set originale non lo era.

Come correggere le violazioni

Sostituire la chiamata a ICollection<T>.Contains(T) (o IImmutableSet<T>.Contains(T)) seguita da una chiamata a ISet<T>.Add(T) o ICollection<T>.Remove(T) (o IImmutableSet<T>.Add(T) ) IImmutableSet<T>.Remove(T)con una singola chiamata al secondo metodo.

Esempio

Il frammento di codice seguente mostra una violazione di 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

Il frammento di codice seguente corregge la violazione:

void Run(ISet<string> set)
{
    set.Add("Hello World");
}
Sub Run(set As ISet(Of String))
    set.Add("Hello World")
End Sub

Quando eliminare gli avvisi

Se le prestazioni non sono un problema, è possibile eliminare questo avviso.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable CA1868
// The code that's violating the rule is on this line.
#pragma warning restore CA1868

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

[*.{cs,vb}]
dotnet_diagnostic.CA1868.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.