:salut:
Simple question de débutant en VB.Net et ancien programmeur confirmé VB6, à quoi sert exactement le mot-clé Using dans VB.net ? J'ai rien trouvé de vraiment explicit sur le net à ce sujet !
:merci:
Version imprimable
:salut:
Simple question de débutant en VB.Net et ancien programmeur confirmé VB6, à quoi sert exactement le mot-clé Using dans VB.net ? J'ai rien trouvé de vraiment explicit sur le net à ce sujet !
:merci:
http://www.developpez.net/forums/sho....php?t=1327868
Voir le post de DotNetMatt :ccool:
En gros, ça sert à ce que la méthode Dispose soit appelée automatiquement sur l'objet à la fin du bloc, même en cas d'erreur. Par exemple si tu écris ça :
Le compilateur le transforme en quelque chose comme ça :Code:
1
2
3
4
5 Using s As Stream = OuvrirFichier() ' blabla End Using
(c'est pas tout à fait ça, mais c'est le principe)Code:
1
2
3
4
5
6
7
8
9
10
11 Dim s As Stream Try s = OuvrirFichier() ' blabla Finally If s IsNot Nothing Then s.Dispose() End If End Try
C'est donc un moyen simple de s'assurer qu'une ressource (fichier, connection DB, etc) soit bien libérée à la fin d'un bloc.
Dans le cas d'utilisation d'un fichier par exemple ou tout autre flux qui doit être ouvert, ce bloc permet la fermeture automatique ? D'après les exemples que je vois un peu partout et même sur la MSDN, il font l'ouverture mais pas la fermeture, est-ce correct ?
en théorie il faudrait regarder le code pour savoir (le framework est codé en .net, et le .net est décompilable)
mais en effet dans tous les cas que j'ai vu, la méthode Dispose appelle les méthodes de fermeture
par exemple pour les DbConnection, la méthode Dispose appelle la méthode Close, ca ferme donc la connexion avant de libérer la mémoire non managée
donc avec le using on est en théorie sûr de fermer la connexion en sortie de bloc, et même en cas d'erreur
Oui c'est ça
Oui, la fermeture est implicite si le fichier est ouvert dans une instruction Using
Pas entièrement ;)
Par exemple si tu regardes la classe string avec Reflector ou un autre décompileur, tu verras qu'il y a beaucoup de méthodes "extern" avec le flag MethodImplOptions.InternalCall : elles sont implémentées en code natif au niveau du CLR
Ok :merci: c'est tout ce que je voulais savoir ;)