Compartilhar via


CA1821: Remover finalizadores vazios

Propriedade Valor
ID da regra CA1821
Título Remover finalizadores vazios
Categoria Desempenho
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

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 devido à sobrecarga adicional de desempenho envolvida no acompanhamento do tempo de vida de um 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. Caso um finalizador seja necessário para depuração, coloque o finalizador inteiro 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
    }