Partilhar via


CA1821: Remover finalizadores vazios

Property valor
ID da regra CA1821
Título Remover finalizadores vazios
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Como sugestão

Motivo

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

Descrição da regra

Sempre que puder, evite finalizadores devido à sobrecarga de desempenho adicional envolvida no controle da vida útil 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 qualquer benefício.

Como corrigir violações

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

Quando suprimir avisos

Não suprima uma mensagem desta regra.

Exemplo

O exemplo a seguir mostra um finalizador vazio que deve ser removido, um finalizador que deve ser incluído em #if DEBUG / #endif diretivas e um finalizador que usa as #if DEBUG / #endif diretivas 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
    }