Compartir a través de


CA1821: Quitar los finalizadores vacíos

Nombre de tipo

RemoveEmptyFinalizers

Identificador de comprobación

CA1821

Categoría

Microsoft.Performance

Cambio problemático

Poco problemático

Causa

Un tipo implementa un finalizador que está vacío, llama sólo al finalizador del tipo base o llama sólo a los métodos emitidos condicionalmente.

Descripción de la regla

Siempre que pueda, evite los finalizadores debido a la sobrecarga de rendimiento adicional necesaria para el seguimiento de la duración del objeto. El recolector de elementos no utilizados ejecutará el finalizador antes de recopilar el objeto. Esto significa que se requerirán dos colecciones para recopilar el objeto. Un finalizador vacío no obtiene ningún beneficio de esta sobrecarga adicional.

Cómo corregir infracciones

Quite el finalizador vacío. Si se requiere un finalizador para depurar, enciérrelo en directivas #if DEBUG / #endif.

Cuándo suprimir advertencias

No suprima los mensajes de esta regla. El error para suprimir la finalización disminuye el rendimiento y no proporciona ventajas.

Ejemplo

El ejemplo siguiente muestra un finalizador vacío que se debería quitar, un finalizador que se debería encerrar en directivas #if DEBUG / #endif y un finalizador que utiliza correctamente las directivas #if DEBUG / #endif.

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
}