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
}