Share via


CA1841: Prefer Dictionary Contains metody

Vlastnost Hodnota
ID pravidla CA1841
Název Prefer Dictionary Contains – metody
Kategorie Výkon
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

Toto pravidlo vyhledá volání Contains metody v Keys samotném IDictionary<TKey,TValue> slovníku nebo Values kolekci, která by mohla být nahrazena voláním ContainsKey metody nebo ContainsValue metody v samotném slovníku.

Popis pravidla

Volání Contains na Keys kolekci nebo volání Values může být často dražší než volání ContainsKey nebo ContainsValue samotný slovník:

  • Mnoho implementací slovníku lazily vytvořit instanci kolekcí klíčů a hodnot, což znamená, že přístup k Keys této kolekci nebo Values kolekci může vést k nadbytečným přidělením.
  • Můžete skončit volání rozšiřující metody, IEnumerable<T> pokud klíče nebo hodnoty kolekce používá explicitní rozhraní implementace skrýt metody na ICollection<T>. To může vést ke snížení výkonu, zejména při přístupu ke kolekci klíčů. Většina implementací slovníku dokáže zajistit rychlou kontrolu zahrnutí O(1), zatímco Contains metoda IEnumerable<T> rozšíření obvykle dělá pomalou kontrolu o(n).

Jak opravit porušení

Chcete-li opravit porušení, nahraďte volání na dictionary.Keys.Contains volání nebo dictionary.Values.Contains volání dictionary.ContainsKeydictionary.ContainsValue, v uvedeném pořadí.

Následující fragment kódu ukazuje příklady porušení a postup jejich opravy.

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

Kdy potlačit upozornění

Pokud příslušný kód není kritický pro výkon, je bezpečné potlačit upozornění z tohoto pravidla.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Viz také