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
}