CA1868: Onödigt anrop till "Contains" för uppsättningar

Property Värde
Regel-ID CA1868
Title Onödigt anrop till "Contains" för uppsättningar
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

Ett ISet<T>.Add eller ICollection<T>.Remove -samtal bevakas av ett anrop till Contains. Eller så bevakas ett IImmutableSet<T>.Add eller IImmutableSet<T>.Remove ett samtal av ett anrop till IImmutableSet<T>.Contains.

Regelbeskrivning

Både ISet<T>.Add(T) och ICollection<T>.Remove(T) utför ett uppslag, vilket gör det redundant att anropa ICollection<T>.Contains(T) i förväg. Det är mer effektivt att anropa Add(T) eller Remove(T) direkt, vilket returnerar ett booleskt värde som anger om objektet har lagts till eller tagits bort.

Den här logiken gäller även för IImmutableSet<T>.Add(T) och IImmutableSet<T>.Remove(T), förutom att de antingen returnerar en ny uppsättning om objektet läggs till eller tas bort, eller den ursprungliga uppsättningen om det inte var det.

Så här åtgärdar du överträdelser

Ersätt anropet till ICollection<T>.Contains(T) (eller IImmutableSet<T>.Contains(T)) som följs av ett anrop till ISet<T>.Add(T) eller ICollection<T>.Remove(T) (eller IImmutableSet<T>.Add(T)IImmutableSet<T>.Remove(T)) med ett enda anrop till den senare metoden.

Exempel

Följande kodfragment visar ett brott mot 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

Följande kodfragment åtgärdar överträdelsen:

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

När du ska ignorera varningar

Det är säkert att ignorera den här varningen om prestanda inte är ett problem.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.