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
}