CA1841 : préférez les méthodes Dictionary.Contains
Propriété | Value |
---|---|
Identificateur de la règle | CA1841 |
Titre | Préférer les méthodes Dictionary Contains |
Catégorie | Performances |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Comme suggestion |
Cause
Cette règle localise les appels à une méthode Contains
sur la collection Keys
ou Values
d’une IDictionary<TKey,TValue> qui peut être remplacée par un appel à une méthode ContainsKey
ou ContainsValue
sur le dictionnaire lui-même.
Description de la règle
L’appel de Contains
sur la collection Keys
ou Values
peut souvent être plus coûteux que l’appel de ContainsKey
ou ContainsValue
sur le dictionnaire lui-même :
- De nombreuses implémentations de dictionnaire instancient tardivement les collections de clés et de valeurs, l’accès à la collection
Keys
ouValues
peut alors entraîner des allocations supplémentaires. - Vous pouvez finir par appeler une méthode d’extension sur IEnumerable<T> si la collection de clés ou de valeurs utilise une implémentation d’interface explicite pour masquer des méthodes sur ICollection<T>. Cela peut entraîner des performances réduites, en particulier lors de l’accès à la collection de clés. La plupart des implémentations de dictionnaire peuvent fournir une vérification rapide de l’autonomie des clés O(1), tandis que la méthode d’extension
Contains
sur IEnumerable<T> effectue généralement une vérification lente de l’autonomie O(n).
Comment corriger les violations
Pour corriger les violations, remplacez les appels vers dictionary.Keys.Contains
ou dictionary.Values.Contains
par des appels vers dictionary.ContainsKey
ou dictionary.ContainsValue
, respectivement.
L’extrait de code suivant montre des exemples de violations et la façon de les corriger.
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
Quand supprimer les avertissements
Vous pouvez supprimer les avertissements de cette règle si le code concerné n’est pas critique pour les performances.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1841
// The code that's violating the rule is on this line.
#pragma warning restore CA1841
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1841.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.