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 ou Values 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.

Voir aussi