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
}