Dela via


CA1854: Föredrar IDictionary.TryGetValue(TKey, out TValue) metoden

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

Orsak

En IDictionary elementåtkomst som är skyddad av en IDictionary.ContainsKey kontroll.

Regelbeskrivning

När ett element i en IDictionary används söker indexerarens implementering efter ett null-värde genom att anropa IDictionary.ContainsKey metoden. Om du också anropar IDictionary.ContainsKey i en if -sats för att skydda ett värdeuppslag utförs två sökningar när endast en krävs.

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

Ersätt anropet IDictionary.ContainsKey och elementåtkomsten med ett anrop till IDictionary.TryGetValue metoden.

Överträdelse:

public string? GetValue(string key)
{
    if (_dictionary.ContainsKey(key))
    {
        return _dictionary[key];
    }

    return null;
}
Public Function GetValue(key As String) As String
    If _dictionary.ContainsKey(key) Then
        Return _dictionary(key)
    End If

    Return Nothing
End Function

Lösningen

public string? GetValue(string key)
{
    if (_dictionary.TryGetValue(key, out string? value))
    {
        return value;
    }

    return null;
}
Public Function GetValue(key As String) As String
    Dim value as String

    If _dictionary.TryGetValue(key, value) Then
        Return value
    End If

    Return Nothing
End Function

När du ska ignorera varningar

Det är säkert att ignorera den här varningen om du använder en anpassad implementering av IDictionary som undviker en värdesökning när du IDictionary.ContainsKey utför kontrollen.

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

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

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