Condividi tramite


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

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize