Compartilhar via


Remova os finalizadores vazios

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

Category (Categoria)

Microsoft.desempenho

Quebrando alterar

Não separável

Causa

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

Descrição da regra

Sempre que possível, evite finalizadores devido da sobrecarga de desempenho adicional envolvida no tempo de vida do objeto de acompanhamento.O coletor de lixo executará o finalizador antes de coletar o objeto.Isso significa que duas coleções serão necessárias para coletar o objeto.Um finalizador vazio gera essa sobrecarga adicionados sem nenhum benefício.

Como corrigir violações

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

Quando suprimir avisos

Elimina uma mensagem a partir dessa regra.Falha para suprimir finalização degrada o desempenho e não oferece vantagens de nenhum.

Exemplo

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

using System.Diagnostics;

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
}