Share via


CA1864: Föredrar metoden "IDictionary.TryAdd(TKey, TValue)"

Property Värde
Regel-ID CA1864
Title Föredrar metoden "IDictionary.TryAdd(TKey, TValue)"
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

Dictionary<TKey,TValue>.Add vaktas av ett Dictionary<TKey,TValue>.ContainsKey(TKey) samtal.

Regelbeskrivning

Både Dictionary<TKey,TValue>.ContainsKey(TKey) och Dictionary<TKey,TValue>.Add utför en sökning, som är redundant. Dictionary<TKey,TValue>.Add genererar också ett undantag om nyckeln redan finns i ordlistan. Det är mer effektivt att anropa Dictionary<TKey,TValue>.TryAdd, vilket returnerar ett booleskt värde som anger om värdet har lagts till eller inte. TryAdd skriver inte över nyckelns värde om nyckeln redan finns.

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

Ersätt ett anrop till Dictionary<TKey,TValue>.ContainsKey(TKey) som följs av ett anrop till Dictionary<TKey,TValue>.Add med ett enda anrop till Dictionary<TKey,TValue>.TryAdd.

Exempel

Följande kodfragment visar ett brott mot CA1864:

void Run(IDictionary<int, string> dictionary)
{
    if(!dictionary.ContainsKey(2)) {
        dictionary.Add(2, "Hello World");
    }
}
Sub Run(dictionary As IDictionary(Of Integer, String))
    If Not dictionary.ContainsKey(2) Then
        dictionary.Add(2, "Hello World")
    End If
End Sub

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

void Run(IDictionary<int, string> dictionary)
{
    dictionary.TryAdd(2, "Hello World");
}
Sub Run(dictionary As IDictionary(Of Integer, String))
    dictionary.TryAdd(2, "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 och om du hanterar undantaget som kan genereras av Dictionary<TKey,TValue>.Add.

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 CA1864
// The code that's violating the rule is on this line.
#pragma warning restore CA1864

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.CA1864.severity = none

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