Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA1821 |
| Název | Odeberte prázdné finalizéry |
| Kategorie | Výkon |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Jako návrh |
| Příslušné jazyky | C# a Visual Basic |
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ým režijním nákladům na výkon spojeným se sledováním životnosti objektů. Garbage collector spustí finalizační metodu před tím, než objekt sesbírá. To znamená, že k shromáždění objektu se vyžadují aspoň dvě kolekce. Při prázdném finalizátoru vzniká tato režie bez jakéhokoli užitku.
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 pomocí direktiv #if DEBUG / #endif.
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
}