CA1821: Leere Finalizer entfernen
TypeName |
RemoveEmptyFinalizers |
CheckId |
CA1821 |
Kategorie |
Microsoft.Performance |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Typ implementiert einen Finalizer, der leer ist, ruft nur den Finalizer des Basistyps oder nur bedingt ausgegebene Methoden auf.
Regelbeschreibung
Finalizer sollten möglichst vermieden werden, da durch Verfolgung der Objektlebensdauer zusätzliche Leistung beansprucht wird. Der Garbage Collector führt den Finalizer aus, bevor das Objekt freigegeben wird. Dies bedeutet, dass zwei Auflistungen erforderlich sind, um das Objekt zu erfassen. Ein leerer Finalizer verursacht diesen zusätzlichen Verwaltungsaufwand ohne irgendeinen Nutzen.
Behandeln von Verstößen
Entfernen Sie den leeren Finalizer. Wenn ein Finalizer für das Debuggen erforderlich ist, schließen Sie den gesamten Finalizer in #if DEBUG / #endif-Direktiven ein.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Meldung dieser Regel. Wird der Abschluss nicht unterdrückt, beeinträchtigt dies die Leistung, und es ergeben sich keine Vorteile.
Beispiel
Das folgende Beispiel enthält einen leeren Finalizer, der entfernt werden sollte, einen Finalizer, der in #if DEBUG / #endif-Direktiven eingeschlossen werden sollte, und einen Finalizer, bei dem die #if DEBUG / #endif-Direktiven ordnungsgemäß eingesetzt werden.
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
}