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 :
- System.Collections.Immutable.ImmutableArray<T>
- System.Collections.Immutable.ImmutableList<T>
- System.Collections.Immutable.ImmutableHashSet<T>
- System.Collections.Immutable.ImmutableSortedSet<T>
- System.Collections.Immutable.ImmutableDictionary<TKey,TValue>
- System.Collections.Immutable.ImmutableSortedDictionary<TKey,TValue>
Ces types définissent des méthodes d’extension qui créent une collection immuable à partir d’une collection IEnumerable<T> existante.
- ImmutableArray<T> définit ToImmutableArray.
- ImmutableList<T> définit ToImmutableList.
- ImmutableHashSet<T> définit ToImmutableHashSet.
- ImmutableSortedSet<T> définit ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> définit ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> définit ToImmutableSortedDictionary.
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.
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.