Numéro d'article: 315528 - Dernière mise à jour: vendredi 11 mai 2007 - Version: 1.3

INFO : Implémentation de la méthode Dispose dans une classe dérivée

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.
Ancien nº de publication de cet article : F315528
Agrandir tout | Réduire tout

Résumé

Lorsque vous créez une classe qui étend une classe de base, vous devez gérer la libération des ressources allouées, d'une manière ou d'une autre. Pour ce faire, la méthode Dispose de la classe de base doit être substituée (redéclarée) dans les classes dérivées. Cet article aborde des problèmes couramment rencontrés dans ce scénario et explique la procédure à suivre pour substituer (redéclarer) correctement la méthode Dispose. Il est destiné à clarifier certaines des subtilités de l'article d'Aide Visual Basic .NET suivant :
http://msdn2.microsoft.com/en-us/library/fs2xkftw(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/fs2xkftw(vs.71).aspx)
Consultez ce document d'Aide pour obtenir des informations détaillées sur la gestion des erreurs et des exemples généraux de la méthode Dispose.

Plus d'informations

Une classe de base doit contenir un ensemble surchargé de méthodes Dispose. La première instance de l'exemple de code qui suit est une version sans paramètres, et la seconde instance accepte un paramètre booléen :
'Méthode appelée en Public, pour s'assurer que TRUE est passée à Dispose
Public Overloads Notoverridable Sub Dispose()
    Dispose( TRUE )
    ' Mise dans la queue de finalisation.
    GC.SuppressFinalize(Me)
End Sub

'Méthode qui libère les ressources (Dispose)
Protected Overloads Overridable Sub Dispose(ByVal disposing As Boolean)
    'Nettoyage des ressources
End Sub


Dispose() est la méthode appelée lorsqu'un objet est supprimé du code dans lequel il a été créé. C'est une méthode Public. Par conséquent, elle peut être utilisée lorsqu'une instance de la classe existe. La méthode Dispose() appelle ensuite la méthode Dispose(Boolean) et passe une valeur TRUE. La méthode Dispose(Boolean) est responsable du nettoyage des ressources de la classe.

Lorsqu'une classe est dérivée d'une classe de base, seule la méthode Dispose(Boolean) doit être substituée. Tout le nettoyage des ressources de la classe dérivée est effectué dans cette méthode substituée, puis la méthode Dispose(Boolean) pour la classe de base est appelée. Voici un exemple primitif de la fonction substituant la classe de base :
Protected Overloads Overrides Sub Dispose(disposing As Boolean)
   'Nettoyage des ressources
   MyBase.Dispose(disposing)
End Sub
La classe dérivée ne nécessite pas de méthode Dispose() car cette méthode est héritée de la classe de base. Lorsque la méthode Dispose() est appelée sur une instance de la classe dérivée, elle utilise la méthode Dispose(Boolean) de la classe dérivée plutôt que celle de la classe de base. Il est alors important que la méthode Dispose(Boolean) de la classe dérivée appelle la méthode Dispose(Boolean) de la classe de base. Cette opération est effectuée à l'aide de la méthode MyBase.Dispose(disposing). La méthode Dispose(Boolean) de la classe de base doit être appelée pour garantir que les ressources de la classe de base sont également supprimées.

Dispose() sert de point d'entrée pour l'accès public à la suppression d'un objet et permet de garantir que la valeur TRUE est passée à la méthode Dispose(Boolean). La valeur FALSE doit être passée uniquement lorsque la méthode Dispose(Boolean) est appelée par la méthode d'exécution ou la méthode Finalize. Lorsque la valeur FALSE est passée, seules les ressources non gérées sont supprimées. Lorsque la valeur TRUE est passée, les ressources gérées et non gérées sont supprimées.

L'environnement de développement Visual Studio insère le code pour substituer la méthode Dispose() dans une classe qui hérite d'un objet système (par exemple, Inherits System.Windows.Forms.TextBox). Cela s'effectue à partir des menus (situés, par défaut, en haut de la fenêtre de code) en sélectionnant Substitutions, puis en cliquant sur Dispose(). Le code inséré ressemble à celui-ci :
Public Overloads Overrides Sub Dispose()
   'Nettoyage des ressources
End Sub
Si cette opération est effectuée, aucune erreur de compilation n'est générée. Cependant, lorsque la classe dérivée est chargée pendant l'exécution, vous recevez un message d'erreur d'exécution semblable au suivant :
Une exception non gérée du type 'System.TypeLoadException' s'est produite dans system.windows.forms.dll.

Informations supplémentaires : La déclaration référencée dans une implémentation de méthode ne peut pas être une méthode finale. Type : ClassLibrary1.UserControl1. Assembly : Dispose.
REMARQUE : La valeur Type sera différente de celle spécifiée dans l'exemple précédent. Elle correspond simplement au nom de la classe qui a tenté d'utiliser une méthode Dispose() incorrectement substituée.

Pour corriger ce problème, il vous suffit de surcharger la méthode Dispose(Boolean) au lieu de Dispose(), et de vous assurer qu'un appel est effectué à la méthode Dispose(Boolean) de la classe de base et que la valeur TRUE est passée à cette méthode.

REMARQUE : Dans Visual Basic .NET, le mot clé Overridable est utilisé comme le mot clé Virtual dans C# et C++. Les méthodes sont, par défaut, NotOverridable.

Références

Rubriques d'aide connexes :

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic .NET 2002 Initiation
Mots-clés : 
kberrmsg kbinfo KB315528
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.