Sdílet prostřednictvím


CA1821: Odstraňte prázdné finalizační metody

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

Kategorie

Microsoft.Performance

Narušující změna

Nenarušující

Příčina

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

Popis pravidla

Kdykoli je to možné, vyhněte se použití finalizačních metod kvůli dodatečné režii spojené se sledováním životního cyklu objektu.Finalizační metoda bude provedena systémem uvolňování paměti před odstraněním objektu.To znamená, že pro odstranění objektu budou zapotřebí dvě uvolnění.Prázdná finalizační metoda přidává tuto nadbytečnou režii bez žádného přínosu.

Jak vyřešit porušení

Odstraňte prázdnou finalizační metodu.Je-li finalizační metoda potřebná pro ladění, uzavřete celou metodu do direktiv #if DEBUG / #endif.

Kdy potlačit upozornění

Zprávu tohoto pravidla nepotlačujte.Není-li finalizace potlačena, dojde k neopodstatněnému snížení výkonu.

Příklad

Následující příklad ukazuje prázdnou finalizační metodu, která by měla být odstraněna, metodu, která by měla být uzavřena do direktiv #if DEBUG / #endif a metodu, která direktivy #if DEBUG / #endif správně používá.

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
}