CA2009: Non chiamare ToImmutableCollection su un valore ImmutableCollection
Proprietà | valore |
---|---|
ID regola | CA2009 |
Title | Non chiamare ToImmutableCollection su un valore ImmutableCollection |
Categoria | Affidabilità |
Correzione che causa un'interruzione o un'interruzione | Nessuna interruzione |
Abilitato per impostazione predefinita in .NET 8 | Come suggerimento |
Causa
ToImmutable
il metodo è stato chiamato inutilmente su una raccolta non modificabile dallo System.Collections.Immutable spazio dei nomi.
Descrizione regola
System.Collections.Immutable lo spazio dei nomi contiene tipi che definiscono raccolte non modificabili. Questa regola analizza i tipi di raccolta non modificabili seguenti:
- 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>
Questi tipi definiscono metodi di estensione che creano una nuova raccolta non modificabile da una raccolta esistente IEnumerable<T> .
- ImmutableArray<T> definisce ToImmutableArray.
- ImmutableList<T> definisce ToImmutableList.
- ImmutableHashSet<T> definisce ToImmutableHashSet.
- ImmutableSortedSet<T> definisce ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> definisce ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> definisce ToImmutableSortedDictionary.
Questi metodi di estensione sono progettati per convertire una raccolta modificabile in una raccolta non modificabile. Tuttavia, il chiamante potrebbe passare accidentalmente una raccolta non modificabile come input a questi metodi. Ciò può rappresentare un problema di prestazioni e/o funzionale.
- Problema di prestazioni: controlli di tipo boxing, unboxing e/o runtime non necessari in una raccolta non modificabile.
- Potenziale problema funzionale: il chiamante presupponeva che operasse su una raccolta modificabile, quando in realtà aveva una raccolta non modificabile.
Come correggere le violazioni
Per correggere le violazioni, rimuovere la chiamata ridondante ToImmutable
in una raccolta non modificabile. Ad esempio, i due frammenti di codice seguenti mostrano una violazione della regola e come risolverli:
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);
}
}
Suggerimento
Una correzione del codice è disponibile per questa regola in Visual Studio. Per usarlo, posizionare il cursore sulla violazione e premere CTRL+. (punto). Scegliere Rimuovi chiamata ridondante dall'elenco delle opzioni presentate.
Quando eliminare gli avvisi
Non eliminare le violazioni da questa regola, a meno che non si sia preoccupati dell'impatto sulle prestazioni dalle allocazioni non necessarie di raccolte non modificabili.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none
su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.