Share via


CA1821: Lege finalizers verwijderen

Eigenschappen Weergegeven als
Regel-id CA1821
Titel Lege finalizers verwijderen
Categorie Prestaties
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Als suggestie

Oorzaak

Een type implementeert een finalizer die leeg is, roept alleen de finalizer van het basistype aan of roept alleen voorwaardelijke verzonden methoden aan.

Beschrijving van regel

Vermijd waar mogelijk finalizers vanwege de extra prestatieoverhead die betrokken is bij het bijhouden van de levensduur van objecten. De garbagecollector voert de finalizer uit voordat het object wordt verzameld. Dit betekent dat ten minste twee verzamelingen vereist zijn om het object te verzamelen. Bij een lege finalizer wordt deze extra overhead zonder enig voordeel in rekening gebracht.

Schendingen oplossen

Verwijder de lege finalizer. Als er een finalizer is vereist voor foutopsporing, plaatst u de volledige finalizer in #if DEBUG / #endif instructies.

Wanneer waarschuwingen onderdrukken

Een bericht van deze regel niet onderdrukken.

Opmerking

In het volgende voorbeeld ziet u een lege finalizer die moet worden verwijderd, een finalizer die moet worden ingesloten in #if DEBUG / #endif instructies en een finalizer die de #if DEBUG / #endif instructies correct gebruikt.

    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
    }