Share via


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 8 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.