Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Durée de vie des variables With

4 réponses
Avatar
Jean Saint Jalmes
Bonjour,

La variable temporaire WITH est'elle automatiquement=20
d=E9truite en cas d'erreur VB dans la proc=E9dure d=E9crite ci-
dessous ?

Y a t'il un int=E9r=EAt, en terme de performances et/ou de=20
taille du code compil=E9, =E0 utiliser With - End With avec=20
des structures VB ?

Exemple :

Private Type StructX
Nom as string
Prenom as string
Rue as string
...
end Type

private sub Verif()

Dim X as structX

on error goto Verif_Error
With X
if Nom =3D "" then Error 13
....
End With
Verif_Error:
msgbox "Erreur n=B0 " & err.number & vbcrlf &=20
err.description,vbCritical
end sub

4 réponses

Avatar
Zoury
Salut Jean! :O)


La variable temporaire WITH est'elle automatiquement
détruite en cas d'erreur VB dans la procédure décrite ci-
dessous ?



Généralement oui, mais la doc conseille toutefois d'éviter de sauter dans ou
hors d'un bloc With...


Y a t'il un intérêt, en terme de performances et/ou de
taille du code compilé, à utiliser With - End With avec
des structures VB ?



C'est très pratique lorsque tu as quelque chose comme ceci :
'***
Debug.Print
colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur").Value
Debug.Print
colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur").Price
Debug.Print
colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur").Name
'***

qui devient ceci
'***
With
colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur")
Debug.Print .Value
Debug.Print .Price
Debug.Print .Name
End With
'***

La structure With est facile à lire et à aussi *maintenir*.
De plus elle peut offrir un gain de performance assez intéressant... Dans
l'exemple ci-haut, le recherche l'option Couleur d'un certain détail de
commande. Je dois passer par deux collections et une fonction pour
l'atteindre... Moins je devrai le faire souvent plus rapide sera mon code
car on évite d'aller rechercher encore et encore le même objet.

L'utilisation d'un bloc With est donc équivalente à ceci si on continue avec
l'exemple ci-haut :
'***
Dim opt As Option

Set opt colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur")

Debug.Print opt.Value
Debug.Print opt.Price
Debug.Print opt.Name
'***
En conservant l'objet dans une variable temporaire on évite ainsi de
réappelé les fonctions nécessaire à retrouver cet objet ce qui peut faire
gagner un temps précieux.


Si toutefois on avait eu ceci, comme c'est ton cas ici :
'***
Debug.Print opt.Value
Debug.Print opt.Price
Debug.Print opt.Name
'***
L'utilisation d'un bloc With ici importe peu.. Le code n'est pas vraiment
plus facile à lire et le gain de performance est nul (si c'est pas plus
lent..).

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
ng
>L'utilisation d'un bloc With ici importe peu.. Le code n'est pas vraiment
plus facile à lire et le gain de performance est nul (si c'est pas plus
lent..).


Ah bon ? N'avais-tu pas fait des benchmark un coup pour ça ? Il me semblait
qu'il y avait un gain (négligeable certes) pour les objets COMs.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



Zoury a écrit :

Salut Jean! :O)


La variable temporaire WITH est'elle automatiquement
détruite en cas d'erreur VB dans la procédure décrite ci-
dessous ?



Généralement oui, mais la doc conseille toutefois d'éviter de sauter
dans ou hors d'un bloc With...


Y a t'il un intérêt, en terme de performances et/ou de
taille du code compilé, à utiliser With - End With avec
des structures VB ?



C'est très pratique lorsque tu as quelque chose comme ceci :
'***
Debug.Print



colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur").Value
Debug.Print



colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur").Price
Debug.Print



colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur").Name
'***

qui devient ceci
'***
With



colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur")
Debug.Print .Value
Debug.Print .Price
Debug.Print .Name
End With
'***

La structure With est facile à lire et à aussi *maintenir*.
De plus elle peut offrir un gain de performance assez intéressant...
Dans l'exemple ci-haut, le recherche l'option Couleur d'un certain
détail de commande. Je dois passer par deux collections et une
fonction pour l'atteindre... Moins je devrai le faire souvent plus
rapide sera mon code car on évite d'aller rechercher encore et encore
le même objet.

L'utilisation d'un bloc With est donc équivalente à ceci si on
continue avec l'exemple ci-haut :
'***
Dim opt As Option

Set opt >


colCommandes(lCommandeID).GetDetailCommande(lDetailCommandeID).Options("Coul
eur")

Debug.Print opt.Value
Debug.Print opt.Price
Debug.Print opt.Name
'***
En conservant l'objet dans une variable temporaire on évite ainsi de
réappelé les fonctions nécessaire à retrouver cet objet ce qui peut
faire gagner un temps précieux.


Si toutefois on avait eu ceci, comme c'est ton cas ici :
'***
Debug.Print opt.Value
Debug.Print opt.Price
Debug.Print opt.Name
'***
L'utilisation d'un bloc With ici importe peu.. Le code n'est pas
vraiment plus facile à lire et le gain de performance est nul (si
c'est pas plus lent..).


Avatar
Zoury
hehe! bonne mémoire :O)

le voici justement
http://groups.google.com/groups?selmíGST5SzCHA.2648%40TK2MSFTNGP11

on avait testé des cas du genre A.B.C.D.E sans testé le cas A.B (un seul
membre accédé..), mais logiquement ça ne varie pas beaucoup.. :OP

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
ng
Salut,

le voici justement
http://groups.google.com/groups?selmíGST5SzCHA.2648%40TK2MSFTNGP11


Oui c'est bien ce thread là ;)

on avait testé des cas du genre A.B.C.D.E sans testé le cas A.B (un
seul membre accédé..), mais logiquement ça ne varie pas beaucoup.. :OP


En effet...


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/