CA1821: Remover os finalizadores vazios

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

<strong>Categoria</strong>

Microsoft.Performance

Alteração significativa

Não-separável

Causa

Um tipo implementa um finalizador estiver vazio, chama somente o finalizador do tipo base ou chama somente condicionalmente emitida métodos.

Descrição da regra

Sempre que possível, evite finalizadores causa da sobrecarga de desempenho adicional envolvido na vida útil do objeto de controle. O coletor de lixo executará o finalizador antes que ela coleta o objeto. Isso significa que duas coleções serão necessárias para coletar o objeto. Um finalizador vazio incorre isso maior sobrecarga, sem qualquer 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

Não suprimir a mensagem de que essa regra. Falha para suprimir a finalização diminui o desempenho e não fornece nenhuma benefícios.

Exemplo

O exemplo a seguir mostra um finalizador vazio que deve ser removido, um finalizador que deve ser colocado entre #if DEBUG / #endif 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
}