29
janvier
2010
[VB.NET] Utilisation du With … End With
janvier
2010
Un article de le_phasme
7 Commentaires
Si vous avez dans votre code une suite d’instruction du style:
Form1.TextBox1.BackColor= Red
Form1.TextBox1.Text="BoBo"
Form1.TextBox1.Visible= True
Form1.TextBox1.Text="BoBo"
Form1.TextBox1.Visible= True
Pensez à utiliser With … End With :
With Form1.TextBox1
.BackColor= Red
.Text="BoBo"
.Visible= True
End With
.BackColor= Red
.Text="BoBo"
.Visible= True
End With
Ceci permettra de gagner en performance car l’objet n’est pas ré-évalué à chaque fois et votre code gagnera en clarté !
Par exemple, dans un cas comme celui ci :
Me.txtSqf.Text = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptSqf.ToString
Me.txtNbP.Text = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptNbpeopleMin.ToString
Me.txtNbPMax.Text = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptNbpeoplemax.ToString
Me.txtFloor.Text = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptFloor.ToString
Me.chkTV.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptTv
Me.chkCable.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptCable
Me.chkVCR.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptVcr
Me.chkDVD.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptDvd
Me.chkStereo.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptStereo
Me.chkPhone.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptPhone
Me.chkFax.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptFax
Me.chkADSL.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptAdsl
Me.chkAC.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptAircond
Me.chkFirePl.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptFireplace
Me.chkWash.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptWasher
Me.chkDryer.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptDryer
Me.chkDish.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptDishwasher
Me.chkPets.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptPets
Me.chkSmok.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptSmoking
Me.chkElev.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptElevator
Me.chkPark.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptParking
Me.chkTerr.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptTerrace
Me.chkBalc.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptBalcony
Me.txtNbP.Text = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptNbpeopleMin.ToString
Me.txtNbPMax.Text = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptNbpeoplemax.ToString
Me.txtFloor.Text = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptFloor.ToString
Me.chkTV.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptTv
Me.chkCable.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptCable
Me.chkVCR.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptVcr
Me.chkDVD.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptDvd
Me.chkStereo.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptStereo
Me.chkPhone.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptPhone
Me.chkFax.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptFax
Me.chkADSL.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptAdsl
Me.chkAC.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptAircond
Me.chkFirePl.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptFireplace
Me.chkWash.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptWasher
Me.chkDryer.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptDryer
Me.chkDish.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptDishwasher
Me.chkPets.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptPets
Me.chkSmok.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptSmoking
Me.chkElev.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptElevator
Me.chkPark.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptParking
Me.chkTerr.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptTerrace
Me.chkBalc.Checked = oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt.AptBalcony
Cela s’optimise de la facon suivante :
With oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt
txtSqf.Text = .AptSqf.ToString
…
chkBalc.Checked = .AptBalcony
End With
txtSqf.Text = .AptSqf.ToString
…
chkBalc.Checked = .AptBalcony
End With
« oDossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt » est évalué 1 fois au lieu de 22 fois rien que pour cette portion de code et le code devient nettement plus agréable à lire !
@ pigloo je parlais des versions avant vb.net
> With fait partie de ces vieux restes du vb qui sont passés dans le vb.net…en VB (même en VB6, je crois), si on faisait …on faisait une copie mémoire
Ah, et on me fait remarquer qu’à priori, vb6 gérait déjà de « vrais » objets, donc, l’histoire de la copie d ‘objet doit bien remonter a vb4 ou 5 (oula, ca fait loin )
Dim oApt = DossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt
On copie ici une référence de l’objet, on ne créé/copie/duplique pas d’objet.
La différence est importante.
L’utilisation du With n’apporte aucun gain de performance.
Disons que le With fait partie de ces vieux restes du vb qui sont passés dans le vb.net
Si je me rappelle bien, en VB (même en VB6, je crois), si on faisait :
Dim oApt = DossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt
on faisait une copie mémoire -> effectivement un nouvel objet, donc moins performant que le With
Perso, dans mes premiers soft en vb.net, j’utilisais presque autant le With qu’en VB, maintenant, je fais comme tout le monde, je déclare une nouvelle référence (si je suis contraint et forcé à faire du VB..)
J’ajoute que certains abusent de l’utilisation du With en pensant bien faire.
Exemple déjà vu :
With foo
With bar
.a = .b
…
End With
End With
foo.a = bar.b ?
bar.a = foo.b ?
foo.a = foo.b ?
bar.a = bar.b ?
Je trouve le With inutile et peux prêter à confusion.
Il n’y a pas de création supplémentaire d’objet dans mon code.
La variable oApt n’est qu’une référence sur un objet existant retourné par « DossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt ».
J’écris juste ce que fait en réalité le compilateur pour interpreter le « With ».
Tu peux comparer le code IL généré par les 2 solutions, ils sont strictement identiques.
Oui mais tu créés un objet supplémentaire mais oui sur le principe
rooohhh … faut bien utiliser les possibilités apportées par le langage lol
Encore plus simple et sans « With » :
Dim oApt = DossierAptFormGeneral.DossierAptForm.DossierApt.CurrentApt
txtSqf.Text = oApt.AptSqf.ToString
…
chkBalc.Checked = oApt.AptBalcony