CA1868 : Appel inutile à 'Contains' pour les jeux

Propriété Value
Identificateur de la règle CA1868
Titre Appel inutile à « Contains » pour les jeux
Catégorie Performances
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 À titre de suggestion

Cause

Un appel ISet<T>.Add ou ICollection<T>.Remove un appel est gardé par un appel à Contains. Ou, un appel IImmutableSet<T>.Add ou IImmutableSet<T>.Remove est gardé par un appel à IImmutableSet<T>.Contains.

Description de la règle

Les deux ISet<T>.Add(T) et ICollection<T>.Remove(T) effectuent une recherche, ce qui le rend redondant pour appeler ICollection<T>.Contains(T) au préalable. Il est plus efficace d’appeler Add(T) ou Remove(T) directement, qui retourne une valeur booléenne indiquant si l’élément a été ajouté ou supprimé.

Cette logique s’applique également à IImmutableSet<T>.Add(T) et IImmutableSet<T>.Remove(T), sauf qu’elles retournent un nouveau jeu si l’élément est ajouté ou supprimé, ou le jeu d’origine dans les autres cas.

Comment corriger les violations

Remplacez l’appel à ICollection<T>.Contains(T) (ou IImmutableSet<T>.Contains(T)) suivi d’un appel à ISet<T>.Add(T) ou ICollection<T>.Remove(T) (ou IImmutableSet<T>.Add(T) ou IImmutableSet<T>.Remove(T)) par un seul appel à la dernière méthode.

Exemple

L’extrait de code suivant montre une violation de la règle CA1868 :

void Run(ISet<string> set)
{
    if (!set.Contains("Hello World"))
    {
        set.Add("Hello World");
    }
}
Sub Run(set As ISet(Of String))
    If Not set.Contains("Hello World") Then
        set.Add("Hello World")
    End If
End Sub

L’extrait de code suivant corrige la violation :

void Run(ISet<string> set)
{
    set.Add("Hello World");
}
Sub Run(set As ISet(Of String))
    set.Add("Hello World")
End Sub

Quand supprimer les avertissements

Vous pouvez supprimer cet avertissement sans risque, si les performances ne sont pas un problème.

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 CA1868
// The code that's violating the rule is on this line.
#pragma warning restore CA1868

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.CA1868.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.