Pulizia delle risorse non gestiteCleaning up unmanaged resources

Per la maggior parte degli oggetti creati dall'app, è possibile basarsi sulla Garbage Collector .NET per gestire la gestione della memoria.For the majority of the objects that your app creates, you can rely on the .NET garbage collector to handle memory management. Tuttavia, quando si creano oggetti che includono risorse non gestite, è necessario rilasciare in modo esplicito tali risorse al termine dell'utilizzo.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them. 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.The most common types of unmanaged resources 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. Per questa operazione è necessario fornire un' IDisposable.Dispose implementazione 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 chiama Dispose quando l'oggetto e le risorse che usa non sono più necessari.A consumer of your type calls Dispose when the object (and the resources it uses) are no longer needed. Il metodo Dispose rilascia immediatamente le risorse non gestite.The Dispose method immediately releases the unmanaged resources.

  • Nel caso in cui un consumer del tipo dimentichi di chiamare Dispose , fornire un modo per rilasciare le risorse non gestite.In the event that a consumer of your type forgets to call Dispose, provide a way for your unmanaged resources to be released. A questo scopo è possibile procedere 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 System.Runtime.InteropServices.SafeHandle classe astratta e includono un Finalize metodo affidabile.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle abstract 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.

      o-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. Definire un finalizzatore eseguendo l'override del Object.Finalize metodo.Define a finalizer by overriding the Object.Finalize method.

    Avviso

    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 an 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.

Contenuto della sezioneIn this section

L' implementazione di un metodo Dispose descrive come implementare il modello 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 IDisposable implementano viene descritto il modo in cui i consumer di un tipo garantiscono che Dispose venga chiamata l'implementazione.Using objects that implement IDisposable describes how consumers of a type ensure that its Dispose implementation is called. usingA tale scopo, è consigliabile usare l'istruzione C# (o l'Visual Basic Using ).We recommend using the C# using (or the Visual Basic Using) statement to do this.

Informazioni di riferimentoReference

Tipo/membroType / Member DescrizioneDescription
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.