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
}