Megosztás a következőn keresztül:


CA1821: Üres véglegesítők eltávolítása

Tulajdonság Érték
Szabályazonosító CA1821
Cím Üres véglegesítők eltávolítása
Kategória Teljesítmény
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

Egy típus üres véglegesítőt implementál, csak az alaptípus-véglegesítőt hívja meg, vagy csak feltételesen kibocsátott metódusokat hív meg.

Szabály leírása

Amikor csak lehetséges, kerülje a véglegesítőket az objektum élettartamának nyomon követésével járó többletterhelés miatt. A szemétgyűjtő futtatja a véglegesítőt, mielőtt összegyűjtené az objektumot. Ez azt jelenti, hogy legalább két gyűjteményre van szükség az objektum gyűjtéséhez. Az üres véglegesítő ezt a többletterhelést minden előny nélkül átterjedi.

Szabálysértések kijavítása

Távolítsa el az üres véglegesítőt. Ha a hibakereséshez véglegesítőre van szükség, a teljes véglegesítőt irányelvekbe #if DEBUG / #endif kell ágyazni.

Mikor kell letiltani a figyelmeztetéseket?

Ne tiltsa le a szabályból származó üzeneteket.

Példa

Az alábbi példa egy eltávolítandó üres véglegesítőt, egy irányelvekbe #if DEBUG / #endif foglalt véglegesítőt és az #if DEBUG / #endif irányelveket helyesen használó véglegesítőt mutat be.

    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
    }