CA1821: Ta bort tomma finalatorer
Property | Värde |
---|---|
Regel-ID | CA1821 |
Title | Ta bort tomma finalizers |
Kategori | Prestanda |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
En typ implementerar en finalator som är tom, endast anropar bastypsslutningen eller anropar endast villkorligt avgivna metoder.
Regelbeskrivning
När du kan kan du undvika finalizers på grund av de ytterligare prestandakostnader som ingår i spårning av objektlivslängd. Skräpinsamlaren kör finalizern innan den samlar in objektet. Det innebär att minst två samlingar krävs för att samla in objektet. En tom finalizer medför detta extra kostnader utan någon fördel.
Så här åtgärdar du överträdelser
Ta bort den tomma finalizern. Om en slutförare krävs för felsökning omsluter du hela slutföraren i #if DEBUG / #endif
direktiven.
När du ska ignorera varningar
Ignorera inte ett meddelande från den här regeln.
Exempel
I följande exempel visas en tom finalator som ska tas bort, en finalator som ska omges av #if DEBUG / #endif
direktiv och en slutförare som använder direktiven #if DEBUG / #endif
på rätt sätt.
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
}