Condividi tramite


CA1049: I tipi delle risorse native devono essere Disposable

Articolo Valore
ID regola CA1049
Category Microsoft.Design
Modifica Nessuna interruzione

Causa

Un tipo fa riferimento a un System.IntPtr campo, a un System.UIntPtr campo o a un System.Runtime.InteropServices.HandleRef campo, ma non implementa System.IDisposable.

Descrizione regola

Questa regola presuppone che IntPtri campi , UIntPtre HandleRef archiviano puntatori a risorse non gestite. I tipi che allocano risorse non gestite devono essere implementati IDisposable per consentire ai chiamanti di rilasciare tali risorse su richiesta e ridurre la durata degli oggetti che contengono le risorse.

Il modello di progettazione consigliato per pulire le risorse non gestite consiste nel fornire un mezzo implicito e esplicito per liberare tali risorse usando rispettivamente il System.Object.Finalize metodo e il System.IDisposable.Dispose metodo . Il Garbage Collector chiama il Finalize metodo di un oggetto in un momento indeterminato dopo che l'oggetto non è più raggiungibile. Dopo Finalize la chiamata, è necessario un'ulteriore Garbage Collection per liberare l'oggetto. Il Dispose metodo consente al chiamante di rilasciare in modo esplicito le risorse su richiesta, prima che le risorse vengano rilasciate se lasciate al Garbage Collector. Dopo aver pulito le risorse non gestite, Dispose chiamare il metodo per informare il System.GC.SuppressFinalize Garbage Collector che Finalize non è più necessario chiamare. In questo modo si elimina la necessità di un'operazione di Garbage Collection aggiuntiva e si riduce la durata dell'oggetto.

Come correggere le violazioni

Per correggere una violazione di questa regola, implementare IDisposable.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se il tipo non fa riferimento a una risorsa non gestita. In caso contrario, non eliminare un avviso da questa regola perché l'errore di implementazione IDisposable può causare la mancata disponibilità o la sottoutilizzo delle risorse non gestite.

Esempio

Nell'esempio seguente viene illustrato un tipo che implementa IDisposable per pulire una risorsa non gestita.

using System;

namespace DesignLibrary
{
    public class UnmanagedResources : IDisposable
    {
        IntPtr unmanagedResource;
        bool disposed = false;

        public UnmanagedResources() 
        {
            // Allocate the unmanaged resource ...
        }

        public void Dispose() 
        {
            Dispose(true);
            GC.SuppressFinalize(this); 
        }

        protected virtual void Dispose(bool disposing)
        {
            if(!disposed)
            {
                if(disposing)
                {
                    // Release managed resources.
                }

                // Free the unmanaged resource ...

                unmanagedResource = IntPtr.Zero;

                disposed = true;
            }
        }

        ~UnmanagedResources()
        {
            Dispose(false);
        }
    }
}

CA2115: Chiamare GC.KeepAlive durante l'uso di risorse native

CA1816: Chiamare GC.SuppressFinalize correttamente

CA2216: I tipi Disposable devono dichiarare un finalizzatore

CA1001: I tipi proprietari di campi Disposable devono essere Disposable

Vedi anche