Olvasás angol nyelven

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 9-ben 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 Values Keys 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.ContainsKey dictionary.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);
    }
}

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.

Lásd még