Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per la maggior parte degli oggetti creati dall'app, è possibile fare affidamento su .NET Garbage Collector 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'utilizzo. I tipi più comuni di risorse non gestite sono oggetti che eseguono il wrapping delle risorse del sistema operativo, ad esempio file, finestre, connessioni di rete o connessioni di database. Anche se il Garbage Collector è in grado di tenere traccia della durata di un oggetto che incapsula una risorsa non gestita, non sa come rilasciare e pulire la risorsa non gestita.
Se i tipi usano risorse non gestite, è necessario eseguire le operazioni seguenti:
Implementare il modello dispose. È quindi necessario fornire un'implementazione IDisposable.Dispose per abilitare la versione deterministica delle risorse non gestite. Un consumer del tuo tipo chiama Dispose quando l'oggetto (e le risorse usate) non sono più necessari. Il Dispose metodo rilascia immediatamente le risorse non gestite.
Nel caso in cui un consumer del tuo tipo dimentichi di chiamare Dispose, fornisca un modo per rilasciare le risorse non gestite. Esistono due modi per eseguire questa operazione:
Utilizzare un handle sicuro per avvolgere la risorsa non gestita. Questa è la tecnica consigliata. Gli handle sicuri sono derivati dalla System.Runtime.InteropServices.SafeHandle classe astratta e includono un metodo affidabile Finalize . Quando si utilizza un handle sicuro, è sufficiente implementare l'interfaccia IDisposable e chiamare il metodo Dispose del proprio handle sicuro nella tua implementazione IDisposable.Dispose. Il finalizzatore del SafeHandle viene chiamato automaticamente dal garbage collector se il metodo Dispose non viene invocato.
— o —
Definire un finalizzatore. La finalizzazione consente il rilascio non deterministico delle risorse non gestite quando il consumatore di un tipo non riesce a chiamare IDisposable.Dispose per gestirle in modo deterministico.
Avvertimento
La finalizzazione degli oggetti può essere un'operazione complessa e soggetta a errori, è consigliabile usare un handle sicuro anziché fornire il proprio finalizzatore.
I consumatori del tuo tipo possono quindi chiamare la tua implementazione IDisposable.Dispose direttamente per liberare memoria usata dalle risorse non gestite. Quando si implementa correttamente un metodo Dispose, il metodo Finalize dell'handle sicuro o il proprio override del metodo Object.Finalize diventa un meccanismo di protezione per liberare le risorse nel caso in cui il metodo Dispose non venga chiamato.
In questa sezione
L'implementazione di un metodo Dispose descrive come implementare il modello dispose per il rilascio di risorse non gestite.
Uso di oggetti che implementano IDisposable
descrive il modo in cui i consumatori di un tipo si assicurano che l'implementazione Dispose venga chiamata. Per eseguire questa operazione, è consigliabile usare l'istruzione C# using
(o Visual Basic Using
).
Riferimenti
Tipo/Membro | Descrizione |
---|---|
System.IDisposable | Definisce il metodo per il Dispose rilascio di risorse non gestite. |
Object.Finalize | Fornisce la finalizzazione dell'oggetto se le risorse non gestite non vengono rilasciate dal Dispose metodo . |
GC.SuppressFinalize | Sopprime la finalizzazione. Solitamente, questo metodo viene chiamato da un metodo Dispose per impedire l'esecuzione di un finalizzatore. |