Toon posts:

[VB6/VB.NET]With ... End With

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb even een vraagje over de verschillen tussen VB6 en VB.NET (2003).
Ik gebruik in mijn VB6 code altijd With en End With, omdat ik ooit eens had gelezen dat daardoor de applicatie sneller werkt.
Dus:
code:
1
2
3
4
5
6
      With frmTo.lblAanpassingen(lIndex)
        .top = lNewTop
        .Caption = txtBox.ToolTipText & ": "
        .Visible = True
        lHeigt = .Height
      End With

Nu zag ik dat in VB.NET dit nog steeds kan. Mijn vraag is heeft dat nog zin of is er nu nauwelijks meer snelheidswinst.

Ik vraag dit omdat ik VB.NET code heb, geschreven door iemand anders, waarin het niet wordt gebruikt.
Dus:
code:
1
2
3
4
5
6
Me.MenuItem5.Enabled = CType(resources.GetObject("MenuItem5.Enabled"), Boolean)
Me.MenuItem5.Index = 3
Me.MenuItem5.Shortcut = CType(resources.GetObject("MenuItem5.Shortcut"), System.Windows.Forms.Shortcut)
Me.MenuItem5.ShowShortcut = CType(resources.GetObject("MenuItem5.ShowShortcut"), Boolean)
Me.MenuItem5.Text = resources.GetString("MenuItem5.Text")
Me.MenuItem5.Visible = CType(resources.GetObject("MenuItem5.Visible"), Boolean)

Als het geen snelheidswinst opleverd laat ik het gewoon zo, maar als het wel uitmaakt dan pas ik dat geleidelijk aan.

Ik heb al op Google en MSDN gezocht maar ik kan niets hierover vinden.
Weet iemand van jullie dit?

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

je kan het toch zelf eenvoudig testen door een timertje te laten lopen of zo?
Ik verwacht een marginale snelheidswinst omdat de compiler waarschijnlijk zelf de namen completeert.
(maar zeker weten doe ik dit niet)

ik vind een ander voordeel dat het wat overzichtelijker is, omdat je minder code ziet. Maar dit is ook persoonlijk denk ik.

  • whoami
  • Registratie: December 2000
  • Nu online
Ik geloof niet dat het veel snelheidswinst oplevert. De compiler zal wel slim genoeg zijn, en in beide gevallen dezelfde IL genereren.

Om zeker te zijn, kan je het natuurlijk even uittesten:
schrijf een stukje code waarin je gebruik maakt v/d With cosntruct, en schrijf een stukje waarin je die niet gebruikt.
Bekijk dan mbhv ILDASM eens wat de VB.NET compiler ervan gebakken heeft.

https://fgheysels.github.io/


Verwijderd

"with" creëert impliciet een objectverwijzing, om die in daaropvolgende statements te kunnen weglaten, puur om iets sneller te kunnen programmeren. merk op dat object con- & destructie aan de interpreter/compiler overgelaten wordt, wat ongewenste effecten kan hebben, zoals het niet kunnen garbagecollecten van bepaalde objectverwijzingen.
in .Net is deze manier van werken terecht deprecated, maw. afgeraden.

[ Voor 3% gewijzigd door Verwijderd op 05-10-2005 16:31 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Ik zie nergens in de MSDN dat With deprecated zou zijn ? :?

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik zie het ook nergens in de MSDN staan net zo min als dat de object con- & destructie aan de compiler overgelaten wordt.

Het enige wat ik zie is dat je de naam niet meer volledig hoeft te qaulifien ( of hoe je dat ook schrijft ). Het zal dus denk ook geen snelheidswinst opleveren. Het is eigenlijk net zoiets als een Using statement boven aan bij C# ( weet niet wat de VB.NET variant daar van is )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Nu online
rwb schreef op woensdag 05 oktober 2005 @ 16:44:
Ik zie het ook nergens in de MSDN staan net zo min als dat de object con- & destructie aan de compiler overgelaten wordt.
Idd.
Dat zou trouwens al helemaal quatsch zijn.
Als je een With gebruikt icm een object dat nog niet geconstrueerd is (ergo, null is), zal je een NullReference Exception krijgen.
'Destructie' wordt in .NET 1.1 zowiezo overgelaten aan de CLR (garbage-collection) of aan de programmeur (IDispose).
Het is eigenlijk net zoiets als een Using statement boven aan bij C# ( weet niet wat de VB.NET variant daar van is )
Ik moest ook ff denken aan using in C#, maar als je using gebruikt wordt de Dispose method (als die er is) automatisch aangeroepen als het using block afgesloten wordt. Ik geloof niet dat dit bij With ook gebeurt.
In C# kan je trouwens met using niet dit doen:
code:
1
2
3
4
using( myObject )
{
    .Bliep();
}

https://fgheysels.github.io/


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
whoami schreef op woensdag 05 oktober 2005 @ 16:48:
Ik moest ook ff denken aan using in C#, maar als je using gebruikt wordt de Dispose method (als die er is) automatisch aangeroepen als het using block afgesloten wordt. Ik geloof niet dat dit bij With ook gebeurt.
In C# kan je trouwens met using niet dit doen:
code:
1
2
3
4
using( myObject )
{
    .Bliep();
}
Nope je hebt gelijk, het is helemaal niet gelijk aan de with, die dient in vb.net inderdaad alleen nog maar om sneller code te kunnen kloppen (en ik vind het ook iets leesbaarder).

Using wordt in vb.net 2003 niet ondersteund, vanaf vb.net 2005 is het voor vb.net programmeurs wel mogelijk om using te gebruiken, ook daar kun je dan niet gelijk met de . beginnen maar zul je binnen de using nog een with moeten plaatsen als je dat effect wilt.

Verwijderd

whoami schreef op woensdag 05 oktober 2005 @ 16:48:
[...]

Idd.
Dat zou trouwens al helemaal quatsch zijn.
Als je een With gebruikt icm een object dat nog niet geconstrueerd is (ergo, null is), zal je een NullReference Exception krijgen.
'Destructie' wordt in .NET 1.1 zowiezo overgelaten aan de CLR (garbage-collection) of aan de programmeur (IDispose).
"The way that the VB.BET compiler handles the With
statement is to create a hidden local of the same type, assign a reference
to the object, and use the temporary local for the subsequential calls
within the With/End With block"
with heeft natuurlijk niets met using te maken.

  • whoami
  • Registratie: December 2000
  • Nu online
Aha, maar dan nog doet with helemaal niets met de object construction van het object dat jij gemaakt hebt.
Er wordt dus enkel achter de schermen een local gemaakt, die dan een reference is naar jouw object.

https://fgheysels.github.io/


Verwijderd

mss een beetje ongelukkig geformuleerd, idd. in office 2000 bestond een bug waardoor de hidden local blijft bestaan, met een memoryleak tot gevolg. het with statement kun je wel gebruiken met een object dat nog niet geconstructed is:
Visual Basic:
1
2
3
4
with new object
  .property="blaat"
  .method
end with

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op woensdag 05 oktober 2005 @ 16:48:
[...]
Ik moest ook ff denken aan using in C#, maar als je using gebruikt wordt de Dispose method (als die er is) automatisch aangeroepen als het using block afgesloten wordt. Ik geloof niet dat dit bij With ook gebeurt.
In C# kan je trouwens met using niet dit doen:
code:
1
2
3
4
using( myObject )
{
    .Bliep();
}
O sorry niet helemaal duidelijk door mij opgeschreven. Ik had idd ook wel aan die using gedacht maar ik bedoelde met het stukje text meer de Using die je bovenaan een class kunt gebruiken om een namespace te "usen". Het is natuurlijk lang niet hetzelfde als with maar ik doelde er meer op dat het meer een compiler hint is om niet de FQN te hoeven typen

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op woensdag 05 oktober 2005 @ 17:33:
mss een beetje ongelukkig geformuleerd, idd. in office 2000 bestond een bug waardoor de hidden local blijft bestaan, met een memoryleak tot gevolg. het with statement kun je wel gebruiken met een object dat nog niet geconstructed is:
Visual Basic:
1
2
3
4
with new object
  .property="blaat"
  .method
end with
Hier ga je het toch zelf constructen ? (Zie die new ? )

https://fgheysels.github.io/


Verwijderd

whoami schreef op donderdag 06 oktober 2005 @ 09:00:Hier ga je het toch zelf constructen ? (Zie die new ? )
euhm... ja. maar dat was eigenlijk gewoon wat ik bedoelde. misschien gaan we beter verder in het engels? :+
Pagina: 1