Pulizia delle risorse non gestiteCleaning Up Unmanaged Resources

Per la maggior parte degli oggetti creati dall'app, le attività di gestione della memoria vengono effettuate dal Garbage Collector di .NET.For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. Se però si creano oggetti che includono risorse non gestite, sarà necessario rilasciare esplicitamente queste ultime quando si smette di utilizzarle.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. Il tipo più comune di risorsa non gestita è rappresentato dagli oggetti che eseguono il wrapping di risorse del sistema operativo, quali file, finestre, connessioni di rete o connessioni di database.The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. 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.Although the garbage collector is able to track the lifetime of an object that encapsulates an unmanaged resource, it doesn't know how to release and clean up the unmanaged resource.

Se i tipi utilizzano risorse non gestite, è necessario effettuare le operazioni seguenti:If your types use unmanaged resources, you should do the following:

  • Implementare lo schema Dispose.Implement the dispose pattern. A tale scopo è necessario fornire un'implementazione IDisposable.Dispose per abilitare il rilascio deterministico delle risorse non gestite.This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. Un consumer del tipo in uso chiama Dispose quando l'oggetto e le risorse che utilizza non sono più necessari.A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. Il metodo Dispose rilascia immediatamente le risorse non gestite.The Dispose method immediately releases the unmanaged resources.

  • Impostare il rilascio delle risorse non gestite nel caso in cui un consumer del tipo in uso ometta di chiamare Dispose.Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. Questo risultato può essere raggiunto in due modi:There are two ways to do this:

    • Utilizzare un handle sicuro per eseguire il wrapping della risorsa non gestita.Use a safe handle to wrap your unmanaged resource. Questa è la tecnica consigliata.This is the recommended technique. Gli handle sicuri derivano dalla classe System.Runtime.InteropServices.SafeHandle e includono un metodo Finalize affidabile.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. 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.When you use a safe handle, you simply implement the IDisposable interface and call your safe handle's Dispose method in your IDisposable.Dispose implementation. Il finalizzatore dell'handle sicuro viene chiamato automaticamente dal Garbage Collector se non viene chiamato il metodo Dispose.The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      -oppure-—or—

    • Eseguire l'override del metodo Object.Finalize .Override the Object.Finalize method. 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.Finalization enables the non-deterministic release of unmanaged resources when the consumer of a type fails to call IDisposable.Dispose to dispose of them deterministically. Tuttavia, poiché la finalizzazione dell'oggetto può essere un'operazione complessa e soggetta a errori, è consigliabile utilizzare un handle sicuro anziché fornire il proprio finalizzatore.However, because object finalization can be a complex and error-prone operation, we recommend that you use a safe handle instead of providing your own finalizer.

I consumer del tipo in uso possono quindi chiamare l'implementazione IDisposable.Dispose direttamente per liberare la memoria utilizzata dalle risorse non gestite.Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. 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.When you properly implement a Dispose method, either your safe handle's Finalize method or your own override of the Object.Finalize method becomes a safeguard to clean up resources in the event that the Dispose method is not called.

In questa sezioneIn This Section

Implementazione di un metodo Dispose: descrive come implementare il criterio Dispose per il rilascio delle risorse non gestite.Implementing a Dispose Method Describes how to implement the dispose pattern for releasing unmanaged resources.

Uso di oggetti che implementano IDisposable: descrive come i consumer di un determinato tipo garantiscono che venga chiamata l'implementazione Dispose corrispondente.Using Objects That Implement IDisposable Describes how consumers of a type ensure that its Dispose implementation is called. A tale scopo, si consiglia l'utilizzo dell'istruzione using in C# o l'istruzione Using in Visual Basic.We recommend using the C# using statement or the Visual Basic Using statement to do this.

RiferimentiReference

System.IDisposable
Viene definito il metodo Dispose per il rilascio delle risorse non gestite.Defines the Dispose method for releasing unmanaged resources.

Object.Finalize
Provvede alla finalizzazione dell'oggetto se le risorse non gestite non vengono rilasciate dal metodo Dispose.Provides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
Elimina la finalizzazione.Suppresses finalization. Questo metodo viene abitualmente chiamato da un metodo Dispose per impedire l'esecuzione di un finalizzatore.This method is customarily called from a Dispose method to prevent a finalizer from executing.