Pulizia delle risorse non gestite

Per la maggior parte degli oggetti creati dall'app, è possibile fare affidamento sul Garbage Collector .NET per gestire la gestione della memoria. Tuttavia, quando si creano oggetti che includono risorse non gestite, è necessario rilasciare in modo esplicito tali risorse al termine dell'uso. I tipi più comuni di risorse non gestite sono gli oggetti che eseguono il wrapping delle risorse del sistema operativo, ad esempio file, finestre, connessioni di rete o connessioni di database. Benché il Garbage Collector sia in grado di tenere traccia della durata di un oggetto in cui è incapsulata una risorsa non gestita, non dispone di dati sufficienti per effettuare il rilascio e la pulizia della risorsa non gestita.

Se i tipi utilizzano risorse non gestite, è necessario effettuare le operazioni seguenti:

  • Implementare lo schema Dispose. A questo scopo è necessario fornire IDisposable.Dispose un'implementazione per abilitare il rilascio deterministico delle risorse non gestite. Un consumer del tipo chiama Dispose quando l'oggetto (e le risorse che usa) non sono più necessari. Il metodo Dispose rilascia immediatamente le risorse non gestite.

  • Nel caso in cui un consumer del tipo non chiami , fornire un modo per il rilascio Dispose delle risorse non gestite. A questo scopo è possibile procedere in due modi:

    • Utilizzare un handle sicuro per eseguire il wrapping della risorsa non gestita. Questa è la tecnica consigliata. Cassaforte handle sono derivati dalla System.Runtime.InteropServices.SafeHandle classe astratta e includono un metodo Finalize affidabile. L'utilizzo di un handle sicuro richiede semplicemente l'implementazione dell'interfaccia IDisposable e la chiamata del metodo Dispose dell'handle sicuro nell'implementazione IDisposable.Dispose. Il finalizzatore dell'handle sicuro viene chiamato automaticamente dal Garbage Collector se non viene chiamato il metodo Dispose.

      -o-

    • Definire un finalizzatore. La finalizzazione abilita il rilascio non deterministico delle risorse non gestite quando il consumer di un tipo non riesce a chiamare IDisposable.Dispose per l'eliminazione deterministica.

      Avviso

      Tuttavia, poiché la finalizzazione degli oggetti può essere un'operazione complessa e erta da errori, è consigliabile usare un handle sicuro anziché fornire un finalizzatore personalizzato.

I consumer del tipo in uso possono quindi chiamare l'implementazione IDisposable.Dispose direttamente per liberare la memoria utilizzata dalle risorse non gestite. Quando si implementa correttamente un metodo Dispose, il metodo Finalize o il proprio override del metodo Object.Finalize diventa una misura di protezione per la pulizia delle risorse nel caso in cui il metodo Dispose non venga chiamato.

Contenuto della sezione

L'implementazione di un metodo Dispose descrive come implementare il modello Dispose per rilasciare risorse non gestite.

Uso di IDisposable oggetti che implementano descrive il modo in cui i consumer di un tipo garantiscono che la Dispose relativa implementazione sia chiamata. A tale scopo, è consigliabile usare using l'istruzione C# (o Visual Basic Using ) .

Riferimento

Tipo/Membro Descrizione
System.IDisposable Viene definito il metodo Dispose per il rilascio delle risorse non gestite.
Object.Finalize Provvede alla finalizzazione dell'oggetto se le risorse non gestite non vengono rilasciate dal metodo Dispose.
GC.SuppressFinalize Elimina la finalizzazione. Questo metodo viene abitualmente chiamato da un metodo Dispose per impedire l'esecuzione di un finalizzatore.