Comment : implémenter le modèle DisposeFinalize (Visual Basic)

Mise à jour : novembre 2007

Le modèle DisposeFinalize vérifie que les ressources sont libérées lorsque l'objet n'est plus nécessaire.

Exemple

La classe ResourceClass dans l'exemple suivant utilise des ressources managées et non managées, puis utilise le modèle DisposeFinalize pour les supprimer correctement. Les ressources et leurs fonctions sont les suivantes :

  • L'implémentation de la méthode Dispose autorise les utilisateurs de la classe à supprimer des instances de classe. Cette méthode appelle Dispose(True) pour supprimer les ressources de l'objet, puis appelle SuppressFinalize pour empêcher le code de finalisation de s'exécuter une deuxième fois.

  • La substitution de la méthode Finalize de base autorise le garbage collector du Common Language Runtime (CLR) à supprimer des instances de classe. Cette méthode appelle Dispose(False) pour supprimer les ressources de l'objet. Notez que si Dispose a été appelé précédemment pour l'objet, son appel à SuppressFinalize empêche le garbage collector d'appeler la méthode Finalize.

  • La surcharge de la méthode Dispose exécute le travail de suppression. Elle accepte un paramètre Boolean, disposing, qui indique si votre code a initialisé la suppression de l'objet. Lorsque vous supprimez un objet, toutes ses ressources doivent être supprimées. Lorsque le garbage collector de l'environnement CLR supprime un objet, seules les ressources non managées doivent être supprimées ; le garbage collector supprime automatiquement les ressources managées, si nécessaire.

Pour plus d'informations, consultez Durée de vie d'un objet : création et destruction des objets.

    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

Cet exemple de code est également disponible sous forme d'extrait de code IntelliSense. Dans le sélecteur d'extraits de code, il se trouve dans Langage Visual Basic. Pour plus d'informations, consultez Comment : insérer des extraits de code dans votre code (Visual Basic).

Compilation du code

Cet exemple nécessite les éléments suivants :

Ces modifications doivent être effectuées dans le code :

  • Remplacez ResourceClass par le nom de la classe qui implémente IDisposable.

  • Utilisez le test de AnyOtherMethods dans les méthodes à l'aide des ressources qui ont été supprimées.

  • Remplacez la déclaration managedResource par les déclarations des objets managés de votre classe qui doivent être supprimés. Si une classe implémente IDisposable ou contient une méthode Close, elle doit probablement être supprimée. Dans la méthode Dispose, fermez ou supprimez ces objets.

  • Remplacez la déclaration unManagedResource par les déclarations des objets non managés de votre classe qui doivent être supprimés. La méthode de suppression de ces objets dépend de la définition de l'objet. Pour plus d'informations, consultez la documentation sur l'objet.

Programmation fiable

Une fois que la méthode Dispose a été appelée, les objets contenus dans votre collection ne sont pas valides. Vous devez tester le champ disposed avant d'exécuter des opérations sur votre objet. Pour obtenir un exemple, consultez la méthode AnyOtherMethods dans l'exemple de code.

Voir aussi

Concepts

Implémentation d'une méthode Dispose

Référence

IDisposable

Autres ressources

Garbage collection