CA2009: Não chamar ToImmutableCollection em um valor ImmutableCollection
Property | Valor |
---|---|
ID da regra | CA2009 |
Título | Não chamar ToImmutableCollection em um valor ImmutableCollection |
Categoria | Confiabilidade |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Como sugestão |
Causa
O método ToImmutable
foi chamado desnecessariamente em uma coleção imutável do namespace System.Collections.Immutable.
Descrição da regra
O namespace System.Collections.Immutable contém tipos que definem coleções imutáveis. Essa 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 de uma coleção IEnumerable<T> existente.
- 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 foram projetados para converter uma coleção mutável em uma coleção imutável. No entanto, o chamador pode passar acidentalmente uma coleção imutável como entrada para esses métodos. Isso pode representar um problema funcional e/ou de desempenho.
- Problema de desempenho: verificações de tipo desnecessárias de conversão boxing, conversão unboxing e/ou runtime em uma coleção imutável.
- Problema funcional potencial: o chamador assumiu estar operando em uma coleção mutável, quando ele, na verdade, tinha uma coleção imutável.
Como corrigir violações
Para corrigir violações, remova a chamada ToImmutable
redundante em uma coleção imutável. Por exemplo, os dois seguintes snippets de código mostram uma violação da regra e como corrigi-la:
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);
}
}
Dica
Uma correção de código está disponível para essa regra no Visual Studio. Para usá-la, posicione o cursor sobre a violação e pressione Ctrl+. (ponto). Escolha Remover chamada redundante da lista de opções apresentadas.
Quando suprimir avisos
Não suprima violações dessa regra, a menos que você não esteja preocupado com o impacto no desempenho de alocações desnecessárias de coleções imutáveis.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.