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.
Aggiornamento: novembre 2007
Il modello DisposeFinalize assicura il rilascio delle risorse quando l'oggetto non è più necessario.
Esempio
La classe ResourceClass nell'esempio seguente utilizza risorse gestite e non gestite, quindi utilizza il modello DisposeFinalize per eliminarli in maniera corretta. Le risorse e le relative funzioni sono:
L'implementazione del metodo Dispose, che consente agli utenti della classe di eliminare le istanze della classe. Questo metodo chiama Dispose(True) per eliminare le risorse dell'oggetto, quindi chiama SuppressFinalize per impedire al codice di finalizzazione di essere eseguito una seconda volta.
L'override del metodo Finalize di base, che consente al Garbage Collector del Common Language Runtime di eliminare le istanze della classe. Questo metodo chiama Dispose(False) per eliminare le risorse dell'oggetto. Si noti che se Dispose è stato precedentemente chiamato per l'oggetto, la sua chiamata a SuppressFinalize impedirà al Garbage Collector di chiamare il metodo Finalize.
L'overload del metodo Dispose che effettua il lavoro di eliminazione. Accetta un parametro booleano, disposing, che indica se il codice ha iniziato l'eliminazione dell'oggetto. Quando si elimina un oggetto, tutte le sue risorse devono essere eliminate. Quando il Garbage Collector del Common Language Runtime elimina un oggetto, devono essere eliminate solo le risorse non gestite, il Garbage Collector elimina automaticamente le risorse gestite se necessario.
Per ulteriori informazioni, vedere Durata degli oggetti: come creare e distruggere oggetti.
Public Class ResourceClass
Implements IDisposable
Private managedResource As System.ComponentModel.Component
Private unmanagedResource As IntPtr
Protected disposed As Boolean = False
Public Sub New()
' Insert appropriate constructor code here.
End Sub
Protected Overridable Overloads Sub Dispose( _
ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
managedResource.Dispose()
End If
' Add code here to release the unmanaged resource.
unmanagedResource = IntPtr.Zero
' Note that this is not thread safe.
End If
Me.disposed = True
End Sub
Public Sub AnyOtherMethods()
If Me.disposed Then
Throw New ObjectDisposedException(Me.GetType().ToString, _
"This object has been disposed.")
End If
End Sub
#Region " IDisposable Support "
' Do not change or add Overridable to these methods.
' Put cleanup code in Dispose(ByVal disposing As Boolean).
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
#End Region
End Class
Questo esempio di codice è anche disponibile come frammento di codice IntelliSense. Nella casella di selezione dei frammenti di codice si trova in Linguaggio Visual Basic. Per ulteriori informazioni, vedere Procedura: inserire frammenti nel codice (Visual Basic).
Compilazione del codice
L'esempio presenta i seguenti requisiti:
- Accesso ai membri degli spazi dei nomi System e System.ComponentModel. Aggiungere un'istruzione Imports se non si sta eseguendo il completamento dei nomi dei membri nel codice. Per ulteriori informazioni, vedere Istruzione Imports (tipo e spazio dei nomi .NET).
I seguenti cambiamenti devono essere eseguiti nel codice:
Sostituire ResourceClass con il nome della classe che implementa IDisposable.
Utilizzare il test di AnyOtherMethods in qualsiasi metodo che utilizza le risorse che potrebbero essere state eliminate.
Sostituire la dichiarazione managedResource con le dichiarazioni di oggetti gestiti nella classe che deve essere eliminata. Se una classe implementa IDisposable o ha un metodo Close, significa che probabilmente deve essere eliminata. Nel metodo Dispose chiudere o eliminare questi oggetti.
Sostituire la dichiarazione unManagedResource con le dichiarazioni degli oggetti non gestiti nella classe che deve essere eliminata. Il metodo di eliminazione di questi oggetti dipende dal modo in cui è definito l'oggetto. Per informazioni dettagliate, consultare la documentazione relativa all'oggetto.
Programmazione efficiente
Una volta chiamato il metodo Dispose, gli oggetti contenuti nell'insieme non saranno validi. È necessario eseguire il test del campo disposed prima di eseguire operazioni sull'oggetto. Per un esempio, vedere il metodo AnyOtherMethods nel codice di esempio.
Vedere anche
Concetti
Implementazione di un metodo Dispose