Share via


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