CA1868: Onnodige aanroep naar 'Contains' voor sets
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1868 |
Titel | Onnodige aanroep naar 'Contains' voor sets |
Categorie | Prestaties |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Een ISet<T>.Add of ICollection<T>.Remove oproep wordt bewaakt door een oproep naar Contains. Of een IImmutableSet<T>.Add of IImmutableSet<T>.Remove oproep wordt bewaakt door een oproep naar IImmutableSet<T>.Contains.
Beschrijving van regel
Zowel ISet<T>.Add(T) als ICollection<T>.Remove(T) het uitvoeren van een zoekactie, waardoor het vooraf overbodig is om vooraf aan te roepen ICollection<T>.Contains(T) . Het is efficiënter om aan te roepen Add(T) of Remove(T) rechtstreeks, die een Booleaanse waarde retourneert die aangeeft of het item is toegevoegd of verwijderd.
Deze logica is ook van toepassing op IImmutableSet<T>.Add(T) en IImmutableSet<T>.Remove(T), behalve dat ze een nieuwe set retourneren als het item wordt toegevoegd of verwijderd, of de oorspronkelijke set als dit niet het geval is.
Schendingen oplossen
Vervang de aanroep naar ICollection<T>.Contains(T) (ofIImmutableSet<T>.Contains(T)) die wordt gevolgd door een aanroep naar ISet<T>.Add(T) of ICollection<T>.Remove(T) (ofIImmutableSet<T>.Remove(T)IImmutableSet<T>.Add(T)) door één aanroep naar de laatste methode.
Opmerking
In het volgende codefragment ziet u een schending van 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
Met het volgende codefragment wordt de schending opgelost:
void Run(ISet<string> set)
{
set.Add("Hello World");
}
Sub Run(set As ISet(Of String))
set.Add("Hello World")
End Sub
Wanneer waarschuwingen onderdrukken
Het is veilig om deze waarschuwing te onderdrukken als de prestaties geen probleem zijn.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1868
// The code that's violating the rule is on this line.
#pragma warning restore CA1868
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1868.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.