CA1821: Odstraňte prázdné finalizátory

Vlastnost Hodnota
ID pravidla CA1821
Název Odeberte prázdné finalizéry
Kategorie Výkon
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako návrh
Příslušné jazyky C# a Visual Basic

Příčina

Typ implementuje finalizační metodu, která je prázdná, volá pouze finalizátor základního typu nebo volá pouze podmíněně generované metody.

Popis pravidla

Kdykoli můžete, vyhněte se finalizátorům kvůli dodatečným režijním nákladům na výkon spojeným se sledováním životnosti objektů. Garbage collector spustí finalizační metodu před tím, než objekt sesbírá. To znamená, že k shromáždění objektu se vyžadují aspoň dvě kolekce. Při prázdném finalizátoru vzniká tato režie bez jakéhokoli užitku.

Jak opravit porušení

Odstraňte prázdný finalizátor. Pokud je pro ladění vyžadován finalizátor, uzavřete celý finalizátor pomocí direktiv #if DEBUG / #endif.

Kdy potlačit upozornění

Nepotlačujte zprávu z tohoto pravidla.

Příklad

Následující příklad ukazuje prázdný finalizátor, který by měl být odstraněn, finalizátor, který by měl být uzavřen ve #if DEBUG / #endif direktivách, a finalizátor, který používá direktivy #if DEBUG / #endif správně.

    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
    }