CA1868 : Appel inutile à 'Contains' pour les ensembles

Propriété Valeur
Identificateur de la règle CA1868
Titre Appel inutile à « Contains » pour les ensembles
Catégorie Performance
Le correctif a un effet disruptif ou non disruptif Sans rupture
Activé par défaut dans .NET 10 À titre de suggestion
Langues applicables C# et Visual Basic

Cause

Un appel ISet<T>.Add ou ICollection<T>.Remove 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

ISet<T>.Add(T) et ICollection<T>.Remove(T) effectuent une recherche, ce qui rend redondant d'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’ils retournent un nouvel ensemble si l’élément est ajouté ou supprimé, ou l’ensemble 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.