Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA1841 |
| Titel | Voorkeurswoordenlijst bevat methoden |
| Categorie | Prestaties |
| Fix kan brekend of niet-brekend zijn | Niet-brekend |
| Standaard ingeschakeld in .NET 10 | Als suggestie |
| Toepasselijke talen | C# en Visual Basic |
Oorzaak
Met deze regel worden aanroepen naar een Contains methode gevonden voor de Keys of Values collectie van een IDictionary<TKey,TValue> die kan worden vervangen door een aanroep naar een ContainsKey of ContainsValue methode op de woordenlijst zelf.
Beschrijving van regel
Het aanroepen van Contains op de Keys of Values verzameling kan vaak duurder zijn dan ContainsKey of ContainsValue op de woordenlijst zelf aanroepen.
- Veel woordenboekimplementaties instantiëren de sleutel- en waardeverzamelingen pas wanneer nodig, wat betekent dat het benaderen van de
Keys-verzameling ofValues-verzameling kan resulteren in extra toewijzingen. - U kunt uiteindelijk een extensiemethode IEnumerable<T> aanroepen als voor de verzameling sleutels of waarden expliciete interface-implementatie wordt gebruikt om methoden op ICollection<T>te verbergen. Dit kan leiden tot verminderde prestaties, met name bij het openen van de sleutelverzameling. De meeste implementaties van woordenboeken kunnen een snelle O(1)-bevattingstoets voor sleutels bieden, terwijl de
Containsextensiemethode op IEnumerable<T> meestal een trage O(n)-bevattingstoets doet.
Hoe schendingen op te lossen
Als u schendingen wilt oplossen, vervangt u aanroepen naar dictionary.Keys.Contains of dictionary.Values.Contains respectievelijk door aanroepen naar dictionary.ContainsKey of dictionary.ContainsValue, respectievelijk.
In het volgende codefragment ziet u voorbeelden van schendingen en hoe u deze kunt oplossen.
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
Wanneer waarschuwingen onderdrukken
Het is veilig om waarschuwingen van deze regel te onderdrukken als de betreffende code geen prestatiekritiek is.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1841
// The code that's violating the rule is on this line.
#pragma warning restore CA1841
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1841.severity = none
Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.