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);
// }
}
Regole correlate
CA1816: Chiamare GC.SuppressFinalize correttamente