Procedura: implementare il modello DisposeFinalize (Visual Basic)

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:

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

Riferimenti

IDisposable

Altre risorse

Garbage Collection