Condividi tramite


Rimuovere i finalizzatori vuoti

Aggiornamento: novembre 2007

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

Categoria

Microsoft.Performance

Breaking Change

Non sostanziale

Causa

Un tipo implementa un finalizzatore vuoto, chiama solo il finalizzatore del tipo di base o chiama solo metodi emessi in base a determinate condizioni.

Descrizione della regola

Quando possibile, evitare di utilizzare i finalizzatori per non sovraccaricare ulteriormente le prestazioni durante il rilevamento della durata dell'oggetto. Il Garbage Collector eseguirà il finalizzatore prima di raccogliere l'oggetto. Pertanto, per raccogliere l'oggetto saranno necessarie due raccolte. Un finalizzatore vuoto produrrebbe sovraccarico aggiuntivo senza alcun vantaggio.

Correzione di violazioni

Rimuovere il finalizzatore vuoto. Se un finalizzatore è richiesto per il debug, includerlo per intero nelle direttive #if DEBUG / #endif.

Esclusione di avvisi

Non sopprimere un messaggio da questa regola. La mancata eliminazione della finalizzazione comporta un calo delle prestazioni e non offre alcun vantaggio.

Esempio

Nell'esempio seguente è illustrato un finalizzatore vuoto che deve essere rimosso, un finalizzatore che deve essere incluso nelle direttive #if DEBUG / #endif e un finalizzatore che utilizza correttamente le direttive #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
}