Compartilhar via


CA2009: Não execute a função ToImmutableCollection em um valor ImmutableCollection

Propriedade Valor
ID da regra CA2009
Título Não chamar a função ToImmutableCollection em um valor ImmutableCollection
Categoria Confiabilidade
Correção interruptiva ou sem interrupção Inquebrável
Habilitado por padrão no .NET 10 Como sugestão
Idiomas aplicáveis C# e Visual Basic

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: boxing, unboxing e/ou verificações de tipo em tempo de execução desnecessárias em uma coleção imutável.
  • Problema funcional potencial: presumiu-se que o chamador estava 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 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 que é apresentada.

Solução de código para CA2009 - Não chamar ToImmutableCollection em um valor ImmutableCollection

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