CA1821: Rimuovere i finalizzatori vuoti

Proprietà valore
ID regola CA1821
Title Rimuovere i finalizzatori vuoti
Categoria Prestazioni
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Un tipo implementa un finalizzatore vuoto, chiama solo il finalizzatore del tipo di base o chiama solo metodi generati in modo condizionale.

Descrizione regola

Ogni volta che è possibile, evitare i finalizzatori a causa del sovraccarico aggiuntivo delle prestazioni coinvolto nel rilevamento della durata degli oggetti. Il Garbage Collector esegue il finalizzatore prima di raccogliere l'oggetto. Ciò significa che per raccogliere l'oggetto sono necessarie almeno due raccolte. Un finalizzatore vuoto comporta questo sovraccarico aggiuntivo senza alcun vantaggio.

Come correggere le violazioni

Rimuovere il finalizzatore vuoto. Se è necessario un finalizzatore per il debug, racchiudere l'intero finalizzatore nelle #if DEBUG / #endif direttive.

Quando eliminare gli avvisi

Non eliminare un messaggio da questa regola.

Esempio

L'esempio seguente mostra un finalizzatore vuoto che deve essere rimosso, un finalizzatore che deve essere racchiuso nelle #if DEBUG / #endif direttive e un finalizzatore che usa correttamente le #if DEBUG / #endif direttive.

    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
    }