Share via


CA2216: Engångstyper bör deklarera finalator

Property Värde
Regel-ID CA2216
Rubrik Engångstyper bör deklarera finalizer
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

En typ som implementerar System.IDisposable, och har fält som tyder på användning av ohanterade resurser, implementerar inte en finalizer enligt beskrivningen i System.Object.Finalize.

Regelbeskrivning

En överträdelse av den här regeln rapporteras om engångstypen innehåller fält av följande typer:

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln implementerar du en finalator som anropar din Dispose metod.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln om typen inte implementeras IDisposable i syfte att frigöra ohanterade resurser.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel

I följande exempel visas en typ som bryter mot den här regeln.

public class DisposeMissingFinalize : IDisposable
{
    private bool disposed = false;
    private IntPtr unmanagedResource;

    [DllImport("native.dll")]
    private static extern IntPtr AllocateUnmanagedResource();

    [DllImport("native.dll")]
    private static extern void FreeUnmanagedResource(IntPtr p);

    DisposeMissingFinalize()
    {
        unmanagedResource = AllocateUnmanagedResource();
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            // Dispose of resources held by this instance.
            FreeUnmanagedResource(unmanagedResource);
            disposed = true;

            // Suppress finalization of this disposed instance.
            if (disposing)
            {
                GC.SuppressFinalize(this);
            }
        }
    }

    public void Dispose()
    {
        Dispose(true);
    }

    // Disposable types with unmanaged resources implement a finalizer.
    // Uncomment the following code to satisfy rule:
    //  DisposableTypesShouldDeclareFinalizer
    // ~TypeA()
    // {
    //     Dispose(false);
    // }
}

CA1816: Ring GC. SuppressFinalize korrekt

Se även