Partilhar via


CA1859: Use tipos de concreto quando possível para melhorar o desempenho

Property valor
ID da regra CA1859
Título Use tipos de concreto sempre que possível para melhorar o desempenho
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Versão introduzida .NET 8
Habilitado por padrão no .NET 9 Como sugestão

Motivo

O código usa tipos de interface ou tipos abstratos, levando a chamadas de interface desnecessárias ou chamadas virtuais.

Descrição da regra

Esta regra recomenda atualizar o tipo de variáveis locais específicas, campos, propriedades, parâmetros de método e tipos de retorno de método de tipos de interface ou abstratos para tipos concretos quando possível. O uso de tipos concretos leva a um código gerado de maior qualidade, minimizando a sobrecarga de despacho virtual ou de interface e permitindo o inlining.

Esta regra só relata violações quando há chamadas virtuais ou chamadas de interface que podem realmente ser evitadas usando um tipo concreto.

Como corrigir violações

Atualize os tipos conforme recomendado pela regra. Em geral, alterar o tipo não tem efeito sobre o comportamento do código, mas melhora seu desempenho.

Exemplo

O trecho de código a seguir mostra uma violação de CA1859:

abstract class A
{
    public virtual void M() { }
}

sealed class B : A
{ }

internal class C
{
    private readonly A _a = new B();

    public void Trigger()
    {
        // This performs a virtual call because
        // _a is defined as an abstract class.
        _a.M();
    }
}

O trecho de código a seguir corrige a violação:

abstract class A
{
    public virtual void M() { }
}

sealed class B : A
{ }

internal class C
{
    private readonly B _b = new B();

    public void Trigger()
    {
        _b.M();
    }
}

Quando suprimir avisos

É seguro suprimir um aviso se o desempenho não for uma preocupação.

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 CA1859
// The code that's violating the rule is on this line.
#pragma warning restore CA1859

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA1859.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.