Condividi tramite


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

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize