Dela via


CA1841: Föredrar ordlista innehåller metoder

Egenskap Värde
Regel-ID CA1841
Title Prefer Dictionary Contains methods (Föredra ordlista innehåller metoder)
Kategori Prestanda
Korrigeringen är antingen invasiv eller icke-invasiv Oumbrytbar
Aktiverad som standard i .NET 10 Som förslag
Tillämpliga språk C# och Visual Basic

Orsak

Den här regeln letar upp anrop till en Contains metod i Keys eller Values samlingen av en IDictionary<TKey,TValue> som kan ersättas med ett anrop till en ContainsKey eller ContainsValue -metod i själva ordlistan.

Regelbeskrivning

Att anropa ContainsKeys-samlingen eller Values kan ofta vara dyrare än att anropa ContainsKey eller ContainsValue på lexikonet självt.

  • Många ordlisteimplementeringar instansierar lättjefullt nyckel- och värdekollektionerna, vilket innebär att åtkomst till kollektionen Keys eller Values kan resultera i extra allokeringar.
  • Det kan hända att du anropar en tilläggsmetod på IEnumerable<T> om nyckel- eller värdesamlingen använder explicit gränssnittsimplementering för att dölja metoder i ICollection<T>. Detta kan leda till sämre prestanda, särskilt vid åtkomst till nyckelsamlingen. De flesta ordlisteimplementeringar erbjuder en snabb O(1) inneslutningskontroll för nycklar, medan Contains-tilläggsmetoden på IEnumerable<T> vanligtvis gör en långsam O(n) inneslutningskontroll.

Så här åtgärdar du överträdelser

Om du vill åtgärda överträdelser ersätter du anrop till dictionary.Keys.Contains eller dictionary.Values.Contains med anrop till dictionary.ContainsKey respektive dictionary.ContainsValue.

Följande kodfragment visar exempel på överträdelser och hur du åtgärdar dem.

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

När du ska ignorera varningar

Det är säkert att ignorera varningar från den här regeln om koden i fråga inte är prestandakritisk.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även