Share via


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 8 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 of Values 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.

Zie ook