Freigeben über


CA1821: Leere Finalizer entfernen

Eigenschaft Wert
Regel-ID CA1821
Titel Leere Finalizer entfernen.
Kategorie Leistung
Fix führt zu Unterbrechungen oder bleibt funktionsfähig Untrennbar
Standardmäßig in .NET 10 aktiviert Als Vorschlag
Anwendbare Sprachen C# und Visual Basic

Ursache

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

Regelbeschreibung

Nach Möglichkeit sollten Finalizer vermieden werden, da das Verfolgen der Objektlebensdauer mit zusätzlichem Leistungsaufwand verbunden ist. Der Garbage Collector führt den Finalizer aus, bevor er das Objekt einsammelt. Das bedeutet, dass mindestens zwei Sammlungen erforderlich sind, um das Objekt einzusammeln. Ein leerer Finalizer verursacht diesen zusätzlichen Aufwand, ohne jeglichen Vorteil zu bieten.

So beheben Sie Verstöße

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 Meldung 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
    }