CA1821: Lege finalizers verwijderen
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1821 |
Titel | Lege finalizers verwijderen |
Categorie | Prestaties |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Een type implementeert een finalizer die leeg is, roept alleen de finalizer van het basistype aan of roept alleen voorwaardelijke verzonden methoden aan.
Beschrijving van regel
Vermijd waar mogelijk finalizers vanwege de extra prestatieoverhead die betrokken is bij het bijhouden van de levensduur van objecten. De garbagecollector voert de finalizer uit voordat het object wordt verzameld. Dit betekent dat ten minste twee verzamelingen vereist zijn om het object te verzamelen. Bij een lege finalizer wordt deze extra overhead zonder enig voordeel in rekening gebracht.
Schendingen oplossen
Verwijder de lege finalizer. Als er een finalizer is vereist voor foutopsporing, plaatst u de volledige finalizer in #if DEBUG / #endif
instructies.
Wanneer waarschuwingen onderdrukken
Een bericht van deze regel niet onderdrukken.
Opmerking
In het volgende voorbeeld ziet u een lege finalizer die moet worden verwijderd, een finalizer die moet worden ingesloten in #if DEBUG / #endif
instructies en een finalizer die de #if DEBUG / #endif
instructies correct gebruikt.
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
}