CA1841: Dictionary Contains-Methoden bevorzugen

Eigenschaft Wert
Regel-ID CA1841
Titel Dictionary.Contains-Methoden bevorzugen
Kategorie Leistung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Diese Regel sucht Aufrufe einer Contains-Methode in der Keys- oder Values-Auflistung einer IDictionary<TKey,TValue>, die durch einen Aufruf einer ContainsKey- oder ContainsValue-Methode im Wörterbuch selbst ersetzt werden kann.

Regelbeschreibung

Das Aufrufen von Contains in der Keys- oder Values-Sammlung ist oft teurer als der Aufruf von ContainsKey oder ContainsValue im Wörterbuch selbst:

  • Viele Wörterbuchimplementierungen instanziieren die Schlüssel- und Wertauflistungen verzögert, was bedeutet, dass der Zugriff auf die Keys- oder Values-Auflistung zu zusätzlichen Zuordnungen führen kann.
  • Möglicherweise rufen Sie eine Erweiterungsmethode für IEnumerable<T> auf, wenn die Schlüssel- oder Werteauflistung explizite Schnittstellenimplementierung verwendet, um Methoden für ICollection<T>auszublenden. Dies kann zu geringeren Leistungen führen, insbesondere beim Zugriff auf die Schlüsselauflistung. Die meisten Wörterbuchimplementierungen sind in der Lage, eine schnelle O(1)-Einschlussprüfung für Schlüssel bereitzustellen, während die Contains-Erweiterungsmethode für IEnumerable<T> in der Regel eine langsame O(n)-Einschlussprüfung vornimmt.

Behandeln von Verstößen

Um Verstöße zu behandeln, ersetzen Sie Aufrufe von dictionary.Keys.Contains bzw. dictionary.Values.Contains durch Aufrufe von dictionary.ContainsKey bzw. dictionary.ContainsValue.

Der folgende Codeausschnitt zeigt Beispiele für Verstöße und deren Behebung.

using System.Collections.Generic;
// Importing this namespace brings extension methods for IEnumerable<T> into scope.
using System.Linq;

class Example
{
    void Method()
    {
        var dictionary = new Dictionary<string, int>();

        //  Violation
        dictionary.Keys.Contains("hello world");

        //  Fixed
        dictionary.ContainsKey("hello world");

        //  Violation
        dictionary.Values.Contains(17);

        //  Fixed
        dictionary.ContainsValue(17);
    }
}
Imports System.Collection.Generic
' Importing this namespace brings extension methods for IEnumerable(Of T) into scope.
' Note that in Visual Basic, this namespace is often imported automatically throughout the project.
Imports System.Linq

Class Example
    Private Sub Method()
        Dim dictionary = New Dictionary(Of String, Of Integer)

        ' Violation
        dictionary.Keys.Contains("hello world")

        ' Fixed
        dictionary.ContainsKey("hello world")

        ' Violation
        dictionary.Values.Contains(17)

        ' Fixed
        dictionary.ContainsValue(17)
    End Sub
End Class

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, Warnungen aus dieser Regel zu unterdrücken, wenn der in Frage kommende Code für die Leistung nicht entscheidend ist.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch