Udostępnij za pośrednictwem


CA1821: Usuń puste finalizatory

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

Kategoria

Microsoft.Performance

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ implementuje finalizator, który jest pusty, wywołuje tylko finalizator typu podstawowego lub wywołuje tylko metody emitowane warunkowo.

Opis reguły

Jeśli to tylko możliwe, należy unikać finalizatorów ze względu na dodatkowe obciążenie, które bierze udział w śledzeniu okresu istnienia obiektu.Moduł zbierający elementy bezużyteczne uruchomi finalizator przed zebraniem obiektu.Oznacza to, że do zebrania obiektu będą wymagane dwie kolekcje.Pusty finalizator powoduje dodatkowy zapas bez żadnych korzyści.

Jak naprawić naruszenia

Usuń pusty finalizator.Jeśli finalizator jest wymagany do debugowania, należy ująć cały finalizator w dyrektywach #if DEBUG / #endif.

Kiedy pominąć ostrzeżenia

Nie należy pomijać komunikatu dotyczącego tej reguły.Niepowodzenie pominięcia finalizacji zmniejsza wydajność i nie dostarcza żadnych korzyści.

Przykład

Poniższy przykład pokazuje pusty finalizator, który powinien zostać usunięty, finalizator, który powinien zostać ujęty w dyrektywy #if DEBUG / #endif i finalizator, który poprawnie używa dyrektyw #if DEBUG / #endif.

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
}