CA2216: I tipi Disposable devono dichiarare un finalizzatore
TypeName |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Un tipo che implementa System.IDisposable e presenta campi che suggeriscono l'utilizzo di risorse non gestite non implementa un finalizzatore come descritto da Object.Finalize.
Descrizione della regola
Viene segnalata una violazione di questa regola se il tipo Disposable contiene campi dei tipi riportati di seguito:
Come correggere le violazioni
Per correggere una violazione di questa regola, implementare un finalizzatore che chiami il metodo Dispose.
Esclusione di avvisi
L'esclusione di un avviso da questa regola è sicura se il tipo non implementa IDisposable allo scopo di rilasciare risorse non gestite.
Esempio
Nell'esempio riportato di seguito viene illustrato un tipo che viola questa regola.
using System;
using System.Runtime.InteropServices;
namespace UsageLibrary
{
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
CA2115: Chiamare GC.KeepAlive durante l'utilizzo di risorse native
CA1816: Chiamare GC.SuppressFinalize correttamente
CA1049: I tipi delle risorse native devono essere Disposable
Vedere anche
Riferimenti
Implementazione dei metodi Finalize e Dispose per la pulizia delle risorse non gestite