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 |
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.
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ényhezValues
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.
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.ContainsValue
arra 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
Ha a szóban forgó kód nem teljesítménykritikus, nyugodtan letilthatja a szabály figyelmeztetéseit.
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.
.NET-visszajelzés
A(z) .NET egy nyílt forráskód projekt. Visszajelzés adásához válasszon egy hivatkozást: