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