CA1841: Voorkeurswoordenlijst bevat methoden
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1841 |
Titel | Voorkeurswoordenlijst bevat methoden |
Categorie | Prestaties |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Met deze regel worden aanroepen naar een Contains
methode gevonden voor de Keys
of Values
verzameling van een IDictionary<TKey,TValue> methode die kan worden vervangen door een aanroep naar een ContainsKey
of ContainsValue
methode in de woordenlijst zelf.
Beschrijving van regel
Het aanroepen van Contains
de Keys
of Values
verzameling kan vaak duurder zijn dan bellen ContainsKey
of ContainsValue
in de woordenlijst zelf:
- Veel woordenlijstimplementaties instantiëren de sleutel- en waardeverzamelingen, wat betekent dat het openen van de
Keys
verzameling ofValues
verzameling kan leiden tot extra toewijzingen. - U kunt uiteindelijk een extensiemethode IEnumerable<T> aanroepen als voor de verzameling sleutels of waarden expliciete interface-implementatie wordt gebruikt om methoden op ICollection<T>te verbergen. Dit kan leiden tot verminderde prestaties, met name bij het openen van de sleutelverzameling. De meeste implementaties van woordenlijst kunnen een snelle O(1)-insluitingscontrole voor sleutels bieden, terwijl de
Contains
extensiemethode IEnumerable<T> meestal een trage O(n) insluitingscontrole doet.
Schendingen oplossen
Als u schendingen wilt oplossen, vervangt u aanroepen naar dictionary.Keys.Contains
of dictionary.Values.Contains
respectievelijk door aanroepen naar dictionary.ContainsKey
of dictionary.ContainsValue
, respectievelijk.
In het volgende codefragment ziet u voorbeelden van schendingen en hoe u deze kunt oplossen.
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
Wanneer waarschuwingen onderdrukken
Het is veilig om waarschuwingen van deze regel te onderdrukken als de betreffende code geen prestatiekritiek is.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1841
// The code that's violating the rule is on this line.
#pragma warning restore CA1841
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1841.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.