Partilhar via


CA2009: Não invocar ToImmutableCollection em um objeto de ImmutableCollection

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:

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> .

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.

Correção de código para CA2009 - Não chames ToImmutableCollection num valor ImmutableCollection

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.

Consulte também