CA2009: Não chame ToImmutableCollection em um valor ImmutableCollection
Property | valor |
---|---|
ID da regra | CA2009 |
Título | Não chame ToImmutableCollection em um valor ImmutableCollection |
Categoria | Fiabilidade |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Como sugestão |
Motivo
ToImmutable
método foi desnecessariamente chamado em uma coleção imutável de System.Collections.Immutable namespace.
Descrição da regra
System.Collections.Immutable namespace contém tipos que definem coleções imutáveis. Esta regra analisa os seguintes tipos de coleção imutáveis:
- 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>
Esses tipos definem métodos de extensão que criam uma nova coleção imutável a partir de uma coleção existente IEnumerable<T> .
- ImmutableArray<T> define ToImmutableArray.
- ImmutableList<T> define ToImmutableList.
- ImmutableHashSet<T> define ToImmutableHashSet.
- ImmutableSortedSet<T> define ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> define ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> define ToImmutableSortedDictionary.
Esses métodos de extensão são projetados para converter uma coleção mutável em uma coleção imutável. No entanto, o chamador pode acidentalmente passar em uma coleção imutável como entrada para esses métodos. Isso pode representar um problema de desempenho e/ou funcional.
- Problema de desempenho: verificações desnecessárias de boxe, unboxing e/ou tipo de tempo de execução em uma coleção imutável.
- Potencial problema funcional: O chamador presumiu estar operando em uma coleção mutável, quando na verdade tinha uma coleção imutável.
Como corrigir violações
Para corrigir violações, remova a chamada redundante ToImmutable
em uma coleção imutável. Por exemplo, os dois trechos de código a seguir mostram uma violação da regra e como corrigi-los:
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);
}
}
Gorjeta
Uma correção de código está disponível para essa regra no Visual Studio. Para usá-lo, posicione o cursor sobre a violação e pressione Ctrl+. Escolha Remover chamada redundante na lista de opções apresentada.
Quando suprimir avisos
Não reprima violações desta regra, a menos que não esteja preocupado com o impacto no desempenho de alocações desnecessárias de coleções imutáveis.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009
Para desabilitar a regra para um arquivo, pasta ou projeto, defina sua severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.