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é par défaut dans .NET 8 À 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
    }