Kommentar
Å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.
| Egenskap | Värde |
|---|---|
| Regel-ID | CA1841 |
| Title | Prefer Dictionary Contains methods (Föredra ordlista innehåller metoder) |
| Kategori | Prestanda |
| Korrigeringen är antingen invasiv eller icke-invasiv | Oumbrytbar |
| Aktiverad som standard i .NET 10 | Som förslag |
| Tillämpliga språk | C# och Visual Basic |
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å lexikonet självt.
- Många ordlisteimplementeringar instansierar lättjefullt nyckel- och värdekollektionerna, vilket innebär att åtkomst till kollektionen
KeysellerValueskan resultera i extra allokeringar. - Det kan hända att du anropar en tilläggsmetod på IEnumerable<T> om nyckel- eller värdesamlingen använder explicit gränssnittsimplementering för att dölja metoder i ICollection<T>. Detta kan leda till sämre prestanda, särskilt vid åtkomst till nyckelsamlingen. De flesta ordlisteimplementeringar erbjuder 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.