Partager via


Supprimer les finaliseurs vides

Mise à jour : novembre 2007

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

Catégorie

Microsoft.Performance

Modification avec rupture

Modification sans rupture

Cause

Un type implémente un finaliseur qui est vide, appelle uniquement le finaliseur de type de base ou appelle uniquement les méthodes émises sous certaines conditions.

Description de la règle

Évitez autant que possible d'utiliser des finaliseurs en raison de la surcharge supplémentaire des performances impliquée dans le suivi de la durée de vie de l'objet. Le garbage collector exécute le finaliseur avant de collecter l'objet. Cela signifie que deux collections sont requises pour collecter l'objet. Un finaliseur vide entraîne cette charge supplémentaire sans aucun avantage.

Comment corriger les violations

Supprimer le finaliseur vide. Si un finaliseur est requis pour le débogage, insérez-le dans les directives #if DEBUG / #endif.

Quand supprimer les avertissements

Ne supprimez aucun message de cette règle. Ne pas parvenir à supprimer une finalisation fait baisser les performances et n'apporte aucun avantage.

Exemple

L'exemple suivant indique un finaliseur vide qui doit être supprimé, un finaliseur qui doit être inséré dans les directives #if DEBUG / #endif et un finaliseur qui utilise les directives #if DEBUG / #endif correctement.

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
}