CA2009 : N’appelez pas ToImmutableCollection sur une valeur ImmutableCollection

Propriété Value
Identificateur de la règle CA2009
Titre N’appelez pas ToImmutableCollection sur une valeur ImmutableCollection
Catégorie Fiabilité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Comme suggestion

Cause

La méthode ToImmutable a été inutilement appelée sur une collection immuable à partir de l’espace de noms System.Collections.Immutable.

Description de la règle

L’espace de noms System.Collections.Immutable contient des types qui définissent des collections immuables. Cette règle analyse les types de collection immuables suivants :

Ces types définissent des méthodes d’extension qui créent une collection immuable à partir d’une collection IEnumerable<T> existante.

Ces méthodes d’extension sont conçues pour convertir une collection modifiable en collection immuable. Toutefois, l’appelant peut passer accidentellement une collection immuable en entrée de ces méthodes, ce qui risque de poser un problème de performances ou un problème fonctionnel.

  • Problème de performances : vérification inutile des conversions boxing, des conversions unboxing ou des types d’exécution sur une collection immuable.
  • Problème fonctionnel : collection immuable considérée à tort comme une collection modifiable par l’appelant.

Comment corriger les violations

Pour corriger les violations, supprimez l’appel ToImmutable superflu sur une collection immuable. Par exemple, les deux extraits de code suivants montrent une violation de la règle et indiquent comment la corriger :

using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This leads to CA2009.
        M2(immutableArray.ToImmutableArray());
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}
using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This is now fine.
        M2(immutableArray);
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}

Conseil

Un correctif de code est disponible pour cette règle dans Visual Studio. Pour l’utiliser, positionnez le curseur sur la violation et appuyez sur Ctrl+. (point). Choisissez Supprimer l’appel superflu dans la liste des options qui vous est présentée.

Code fix for CA2009 - Do not call ToImmutableCollection on an ImmutableCollection value

Quand supprimer les avertissements

Ne supprimez pas les violations de cette règle, excepté si vous ne vous souciez pas de l’impact sur les performances des allocations inutiles de collections immuables.

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

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

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

Voir aussi