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 :
- l'accès aux membres des espaces de noms System et System.ComponentModel. Ajoutez une instruction Imports si vous n'utilisez pas des noms de membres qualifiés complets dans votre code. Pour plus d'informations, consultez Imports, instruction (espace de noms et type .NET).
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