La gestion de la mémoire est un aspect clé lors de l'utilisation d'objets dans Visual Basic, surtout si l'application utilise des ressources nécessitant une libération manuelle : fichiers, connexions à des bases de données ou objets externes.
Dans le VB classique (VB6), les ressources étaient libérées manuellement en appelant Set obj = Nothing. Dans .NET (VB.NET), un ramasse-miettes automatique est mis en place pour nettoyer les objets inutilisés. Cependant, toute libération de mémoire n'est pas effectuée automatiquement, en particulier pour les ressources non gérées.
Le ramasse-miettes automatique libère la mémoire des objets .NET, mais ne sait pas comment récupérer les ressources externes ou manuelles à temps (descripteurs de fichiers, connexions, flux). Ignorer ces détails conduit à des fuites de mémoire et à des blocages de ressources.
Pour libérer correctement les ressources externes, on utilise l'interface IDisposable et l'expression Using...End Using, ce qui garantit une libération déterministe.
Exemple de code :
' Libération garantie du descripteur de fichier Using reader As New StreamReader("data.txt") Dim content As String = reader.ReadToEnd() ' ... traitement des données ... End Using ' Pour les objets ne supportant pas IDisposable, libération manuelle : Dim obj As SomeComObject = New SomeComObject() ' ... utilisation ... System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) obj = Nothing
Caractéristiques clés :
Si je n'utilise pas Using pour FileStream, la ressource sera-t-elle tout de même libérée grâce au GC ?
Non, la libération se produira à un moment indéterminé. Cela peut entraîner un blocage de fichier et une fuite de ressources.
L'appel à Set obj = Nothing est-il équivalent à l'appel de Dispose() ?
Non, Set obj = Nothing ne fait qu'enlever la référence, mais ne garantit pas la libération immédiate des ressources. Dispose() ou Using est le seul moyen sûr pour une libération déterministe.
Dois-je appeler Dispose pour des objets héritant de DataSet/DataTable ?
Oui, bien qu'ils soient libérés par le GC, de nombreuses ressources associées (comme les connexions à des bases de données) nécessitent un appel manuel à Dispose ou Using, surtout pour DataAdapter, Connection, Command.
Lecture de données à partir d'un grand fichier sans Using, sans Dispose. Après un certain temps, l'application ne peut pas ouvrir un nouveau fichier : "File is in use by another process".
Avantages :
Inconvénients :
Ouverture d'une connexion à une base de données ou d'un fichier via Using. Obtention, traitement des données, libération automatique de la ressource.
Avantages :
Inconvénients :