Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Propriedade | valor |
|---|---|
| ID da regra | CA2009 |
| Título | Não chame ToImmutableCollection num valor ImmutableCollection |
| Categoria | Fiabilidade |
| A correção causa interrupção ou não | Ininterrupto |
| Habilitado por padrão no .NET 10 | Como sugestão |
| Línguas aplicáveis | C# e Visual Basic |
Motivo
ToImmutable método foi desnecessariamente chamado numa coleção imutável do espaço de nomes System.Collections.Immutable.
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 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 utilizá-lo, posicione o cursor sobre a violação e pressione Ctrl+. Escolha Remover chamada redundante da 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 de um arquivo, pasta ou projeto, defina sua gravidade 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.