Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| 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
Keyssamlingen ellerValueskan 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
Containstillä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.