Share via


CA1841: Föredrar ordlista innehåller metoder

Property Värde
Regel-ID CA1841
Title Prefer Dictionary Contains methods (Föredra ordlista innehåller metoder)
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

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å själva ordlistan:

  • Många ordlisteimplementeringar instansierar snabbt nyckel- och värdesamlingarna, vilket innebär att åtkomst till Keys samlingen eller Values kan resultera i extra allokeringar.
  • Det kan sluta med att du anropar en tilläggsmetod om IEnumerable<T> samlingen nycklar eller värden använder explicit gränssnittsimplementering för att dölja metoder på ICollection<T>. Detta kan leda till sämre prestanda, särskilt vid åtkomst till nyckelsamlingen. De flesta ordlisteimplementeringar kan ge 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