CA1841: Voorkeurswoordenlijst bevat methoden

Eigenschap Waarde
Regel-id CA1841
Titel Voorkeurswoordenlijst bevat methoden
Categorie Prestaties
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Als suggestie
Toepasselijke talen C# en Visual Basic

Oorzaak

Met deze regel worden aanroepen naar een Contains methode gevonden voor de Keys of Values collectie van een IDictionary<TKey,TValue> die kan worden vervangen door een aanroep naar een ContainsKey of ContainsValue methode op de woordenlijst zelf.

Beschrijving van regel

Het aanroepen van Contains op de Keys of Values verzameling kan vaak duurder zijn dan ContainsKey of ContainsValue op de woordenlijst zelf aanroepen.

  • Veel woordenboekimplementaties instantiëren de sleutel- en waardeverzamelingen pas wanneer nodig, wat betekent dat het benaderen van de Keys-verzameling of Values-verzameling kan resulteren in 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 woordenboeken kunnen een snelle O(1)-bevattingstoets voor sleutels bieden, terwijl de Contains extensiemethode op IEnumerable<T> meestal een trage O(n)-bevattingstoets doet.

Hoe schendingen op te lossen

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 voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

Zie ook