CA1821: Remover finalizadores vazios

Property Valor
ID da regra CA1821
Título Remover finalizadores vazios
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

Um tipo implementa um finalizador vazio, chama apenas o finalizador de tipo base ou chama apenas métodos emitidos condicionalmente.

Descrição da regra

Sempre que possível, evite finalizadores por conta da sobrecarga adicional no desempenho envolvida no acompanhamento do tempo de vida do objeto. O coletor de lixo executa o finalizador antes de coletar o objeto. Isso significa que pelo menos duas coleções são necessárias para coletar o objeto. Um finalizador vazio incorre nessa sobrecarga adicional sem benefício algum.

Como corrigir violações

Remova o finalizador vazio. Se um finalizador for necessário para depuração, coloque todo o finalizador em diretivas #if DEBUG / #endif.

Quando suprimir avisos

Não suprima uma mensagem nessa regra.

Exemplo

O exemplo a seguir mostra um finalizador vazio que deve ser removido, um finalizador que deve ser colocado entre diretivas #if DEBUG / #endif e um finalizador que usa as diretivas #if DEBUG / #endif corretamente.

    public class Class1
    {
        // Violation occurs because the finalizer is empty.
        ~Class1()
        {
        }
    }

    public class Class2
    {
        // Violation occurs because Debug.Fail is a conditional method.
        // The finalizer will contain code only if the DEBUG directive
        // symbol is present at compile time. When the DEBUG
        // directive is not present, the finalizer will still exist, but
        // it will be empty.
        ~Class2()
        {
            Debug.Fail("Finalizer called!");
        }
    }

    public class Class3
    {
#if DEBUG
        // Violation will not occur because the finalizer will exist and
        // contain code when the DEBUG directive is present. When the
        // DEBUG directive is not present, the finalizer will not exist,
        // and therefore not be empty.
        ~Class3()
        {
            Debug.Fail("Finalizer called!");
        }
#endif
    }