Partilhar via


CA2009: Não chame ToImmutableCollection em um valor ImmutableCollection

Property valor
ID da regra CA2009
Título Não chame ToImmutableCollection em um valor ImmutableCollection
Categoria Fiabilidade
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Como sugestão

Motivo

ToImmutable método foi desnecessariamente chamado em uma coleção imutável de System.Collections.Immutable namespace.

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 em 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 usá-lo, posicione o cursor sobre a violação e pressione Ctrl+. Escolha Remover chamada redundante na lista de opções apresentada.

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

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 para um arquivo, pasta ou projeto, defina sua severidade 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