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:

Esses tipos definem métodos de extensão que criam uma nova coleção imutável de uma coleção IEnumerable<T> existente.

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.

Code fix for CA2009 - Do not call ToImmutableCollection on an ImmutableCollection value

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.

Confira também