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 |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | 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.