Condividi tramite


CA2216: I tipi Disposable devono dichiarare un finalizzatore

Proprietà valore
ID regola CA2216
Title I tipi eliminabili devono dichiarare un finalizzatore
Categoria Utilizzo
La correzione causa un'interruzione o meno Non causa un'interruzione
Abilitato per impostazione predefinita in .NET 9 No

Causa

Un tipo che implementa System.IDisposablee include campi che suggeriscono l'uso di risorse non gestite, non implementa un finalizzatore come descritto da System.Object.Finalize.

Descrizione regola

Una violazione di questa regola viene segnalata se il tipo eliminabile contiene campi dei tipi seguenti:

Come correggere le violazioni

Per correggere una violazione di questa regola, implementare un finalizzatore che chiama il Dispose metodo .

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se il tipo non implementa IDisposable allo scopo di rilasciare risorse non gestite.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio

Nell'esempio seguente viene illustrato un tipo che viola questa regola.

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: Chiamare GC.SuppressFinalize correttamente

Vedi anche