OVH Cloud OVH Cloud

Dispose via Nothing

3 réponses
Avatar
Annie L.
Lorsque je déclarait un 'Dataset' dans le code, quand j'en avais terminé,
j'écrivais "MonDataset = Nothing"
Mais dernièrement, j'ai lu que lorsque l'on peut se servir de 'Dispose' s'en
servir pour libérer la mémoire.

Donc, au lieu d'écrire :
"MonDataset = Nothing"

je devrais écrire plutôt :
"MonDataset.Dispose()"

Quand pensez-vous?

'Dispose' libère-t-il la mémoire avant le Garbage Collector??

Voici un exemple de code :

Private Sub cboUtilisateur_SelectionChangeCommitted(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
cboUtilisateur.SelectionChangeCommitted
Dim adaOLEDB As New OleDbDataAdapter
Dim cnnOLEDB As New OleDbConnection
Dim dstUtilisateur As DataSet = New DataSet
Dim dtbUtilisateur As DataTable
Dim drwRangee As DataRow
Dim strChoixLangue As String = ""
Dim intIndex As Integer
Try

......(Gestion du code)

Catch objException As Exception
'gestion d'erreur...
Finally
dstUtilisateur.Dispose()
adaOLEDB.Dispose()
dtbUtilisateur.Dispose()
End Try
End Sub

Regardez dans la section 'Finally'

Je libère 3 variables déclarées au début avec la méthode 'Dispose'

Est-ce correct!
Est-ce que je libère vraiment la mémoire avant le Garbage Collector???

Merci de vos commentaires!

3 réponses

Avatar
Zoury
Salut Annie! :O)

'Dispose' libère-t-il la mémoire avant le Garbage Collector??



En général, si un objet possède une méthode Dispose(), tu devrais l'appeler
explicitement afin de libèrer les *ressources non managées* utilisé par cet
objet. Ainsi tu ne libère pas la mémoire avant le GC mais tu libères la
mémoire qu'il ne peut libérer.

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Annie L.
Que veux-tu dire par *ressources non managées*. J'aimerais avoir une
explication courte.

Donc, "Dispose" libère la mémoire que le GC ne peut libérer!
Cela veut dire que si je ne me sers pas de "Dispose", mon programme va
prendre et prendre de la mémoire sans que le GC ne puisse intervenir???

Beaucoup de question sur ce sujet!

Merci!

"Zoury" wrote:

Salut Annie! :O)

> 'Dispose' libère-t-il la mémoire avant le Garbage Collector??

En général, si un objet possède une méthode Dispose(), tu devrais l'appeler
explicitement afin de libèrer les *ressources non managées* utilisé par cet
objet. Ainsi tu ne libère pas la mémoire avant le GC mais tu libères la
mémoire qu'il ne peut libérer.

--
Cordialement
Yanick
MVP pour Visual Basic





Avatar
Zoury
> Que veux-tu dire par *ressources non managées*. J'aimerais avoir une
explication courte.



Les ressources allouées par le Framework .NET sont des ressources dites
managées (gérées). Ce qui signifie que l'allocation et la libération de la
mémoire est gèrer par le Framework.

Maintenant supposons que tu implémentes une classe qui fait appel à des APIs
allouant de la mémoire (comme CreateFile() par exemple), alors dans ce cas
c'est toi qui est en charge de libérer la mémoire. L'interface IDisposable
sert justement à cela. Elle fournit la méthode Dispose() que tu devrais
implémenté dans ta classe afin d'y libérer les ressources alloués par les
fonctions APIs.

Ce serait également une bonne idée d'y appeler les méthodes Close() des
objets que ta classe utilise (flux, timers, etc..).

Donc, "Dispose" libère la mémoire que le GC ne peut libérer!



Si la personne qui à implémenté IDisposable respecte la convention, alors
oui, c'est exactement cela.


Cela veut dire que si je ne me sers pas de "Dispose", mon programme va
prendre et prendre de la mémoire sans que le GC ne puisse intervenir???



Théoriquement oui. Mais il me semble qu'une bonne implémentation de classe
appelerais la méthode Dispose() dans l'événement Finalize() de la classe qui
se déclenche lorsqu'une occurence est mise à Nothing... Seulement étant
donnée que rien ne garatit cela, il serait mieux amha de l'appeler
explicitement.



Je te suggères l'article de l'aide pour plus d'info et un exemple
d'implémentation. La même page existe en français dans l'aide si tu as
VS.NET français..
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemIDisposableClassDisposeTopic.asp

--
Cordialement
Yanick
MVP pour Visual Basic