CA1821: Leere Finalizer entfernen.

Eigenschaft Wert
Regel-ID CA1821
Titel Leere Finalizer entfernen.
Kategorie Leistung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Ein Typ implementiert einen Finalizer, der leer ist, nur den Finalizerbasistyp aufruft oder nur bedingt ausgegebene Methoden aufruft.

Regelbeschreibung

Finalizer sollten nach Möglichkeit vermieden werden, da durch Verfolgung der Objektlebensdauer zusätzliche Leistung beansprucht wird. Der Garbage Collector führt den Finalizer vor der Objektbereinigung aus. Das bedeutet, dass für die Objektbereinigung mindestens zwei Sammlungsvorgänge erforderlich sind. Ein leerer Finalizer verursacht diesen zusätzlichen Aufwand, ohne jeglichen Vorteil zu bieten.

Behandeln von Verstößen

Entfernen Sie den leeren Finalizer. Wenn ein Finalizer zum Debuggen erforderlich ist, schließen Sie den gesamten Finalizer in #if DEBUG / #endif-Anweisungen ein.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Meldungen aus dieser Regel.

Beispiel

Das folgende Beispiel zeigt einen leeren Finalizer, der entfernt werden sollte, einen Finalizer, der in #if DEBUG / #endif-Anweisungen eingeschlossen werden sollte, und einen Finalizer, der die #if DEBUG / #endif-Anweisungen ordnungsgemäß verwendet.

    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
    }