CA1821: Quitar finalizadores vacíos

Propiedad Value
Identificador de la regla CA1821
Título Quitar finalizadores vacíos
Categoría Rendimiento
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Un tipo implementa un finalizador que está vacío, llama solo al finalizador de tipo base o llama solo a 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 ejecuta el finalizador antes de recopilar el objeto, lo que significa que se necesitan al menos dos recolecciones para recopilar el objeto. Un finalizador vacío supone esta sobrecarga adicional sin ninguna ventaja.

Cómo corregir infracciones

Quite el finalizador vacío. Si se requiere un finalizador para la depuración, incluya el finalizador completo en las directivas de #if DEBUG / #endif.

Cuándo suprimir las advertencias

No suprima un mensaje de esta regla.

Ejemplo

En el ejemplo siguiente se muestra un finalizador vacío que debe quitarse, un finalizador que debe incluirse en las directivas de #if DEBUG / #endif y un finalizador que usa correctamente las directivas de #if DEBUG / #endif.

    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
    }