CA1821 : Supprimez les finaliseurs vides
Propriété | Value |
---|---|
Identificateur de la règle | CA1821 |
Titre | Supprimez les finaliseurs vides |
Catégorie | Performances |
Le correctif est cassant ou non cassant | Sans rupture |
Activée par défaut dans .NET 9 | À titre de suggestion |
Cause
Un type implémente un finaliseur vide ou appelle uniquement soit le finaliseur de type de base, soit des méthodes émises de manière conditionnelle.
Description de la règle
Évitez autant que possible d’utiliser des finaliseurs en raison de la surcharge de performances supplémentaire impliquée dans le suivi de la durée de vie de l’objet. Le récupérateur de mémoire exécute le finaliseur avant de collecter l’objet. De ce fait, au moins deux collections sont nécessaires pour récupérer l’objet. Un finaliseur vide entraîne une surcharge sans aucun avantage.
Comment corriger les violations
Supprimez le finaliseur vide. Si un finaliseur est requis pour le débogage, placez-le entièrement dans des directives #if DEBUG / #endif
.
Quand supprimer les avertissements
Ne supprimez pas un message de cette règle.
Exemple
L’exemple suivant montre un finaliseur vide à supprimer, un finaliseur à inclure dans des directives #if DEBUG / #endif
et un autre qui utilise correctement les directives #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
}