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