CA1821: Odstraňte prázdné finalizační metody
Vlastnost | Hodnota |
---|---|
ID pravidla | CA1821 |
Název | Odeberte prázdné finalizační metody |
Kategorie | Výkon |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | Jako návrh |
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é režii výkonu, která se týká sledování životnosti objektu. Systém uvolňování paměti spustí finalizační metodu předtím, než objekt shromáždí. To znamená, že k shromáždění objektu se vyžadují aspoň dvě kolekce. Při prázdné finalizátoru se tato režie přidala bez jakékoli výhody.
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 do #if DEBUG / #endif
direktiv.
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
}