Partilhar via


CA1821: remover finalizadores vazios

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

Categoria

Microsoft.Performance

Alteração Significativa

Sem quebra

Causa

Um tipo implementa um finalizador que está vazia, chama somente o finalizador do tipo de base, ou chama somente métodos condicional emissores.

Descrição da Regra

Sempre que possível, para evitar finalizers devido à sobrecarga adicional de desempenho que é envolvida no tempo de vida do objeto de rastreamento.O coletor de lixo será executado o finalizador antes de coleta o objeto.Isso significa que duas coleções serão necessárias coletar o objeto.Um finalizador vazia incorre essa sobrecarga adicionada sem nenhum benefício.

Como Corrigir Violações

Remova o finalizador vazia.Se um finalizador depurando, é necessário incluir o finalizador inteiro em políticas de #if DEBUG / #endif .

Quando Suprimir Alertas

Não suprima uma mensagem desta regra.A falha suprimir o desempenho de reduz de acabamento e não fornece nenhum benefício.

Exemplo

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