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 9 | 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 Contains
på Keys
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 ellerValues
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.