I tipi eliminabili devono dichiarare un finalizzatore
Aggiornamento: novembre 2007
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:
Correzione di 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
Chiamare GC.KeepAlive durante l'utilizzo di risorse native
Chiamare correttamente GC.SuppressFinalize
I tipi delle risorse native devono essere disposable
Vedere anche
Riferimenti
Implementazione dei metodi Finalize e Dispose per la pulitura delle risorse non gestite