Megosztás a következőn keresztül:


CA1841: A szótár használata metódusokat tartalmaz

Tulajdonság Érték
Szabályazonosító CA1841
Cím A szótárat tartalmazó metódusok előnyben részesítésében
Kategória Teljesítmény
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

Ez a szabály megkeresi egy Contains metódus hívásait egy IDictionary<TKey,TValue> olyan metóduson Keys vagy Values gyűjteményen, amely helyettesíthető egy vagy ContainsValue egy metódus hívásával ContainsKey a szótárban.

Szabály leírása

A hívás Contains vagy a ValuesKeys gyűjtemény gyakran drágább lehet, mint a hívás ContainsKey vagy ContainsValue a szótár:

  • Számos szótár-implementáció lazán példányosíthatja a kulcs- és értékgyűjteményeket, ami azt jelenti, hogy a Keys gyűjteményhez Values való hozzáférés további foglalásokat eredményezhet.
  • Ha a kulcsok vagy értékek gyűjteménye explicit felületi implementációt használ a metódusok ICollection<T>elrejtéséhez, a bővítménymetódusokat IEnumerable<T> is meghívhatja. Ez a teljesítmény csökkenéséhez vezethet, különösen a kulcsgyűjtemény elérésekor. A legtöbb szótár-implementáció képes gyors O(1) elszigetelés-ellenőrzést biztosítani a kulcsokhoz, míg a Contains bővítménymetódus IEnumerable<T> általában lassú O(n) elszigetelés-ellenőrzést végez.

Szabálysértések kijavítása

A szabálysértések kijavításához cserélje le a dictionary.Keys.Contains hívásokat, illetve dictionary.Values.Contains az dictionary.ContainsKeydictionary.ContainsValuearra irányuló hívásokat.

Az alábbi kódrészlet példákat mutat be a szabálysértésekre és azok kijavítására.

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

Mikor kell letiltani a figyelmeztetéseket?

Ha a szóban forgó kód nem teljesítménykritikus, nyugodtan letilthatja a szabály figyelmeztetéseit.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Kapcsolódó információk