De With...End With-operator maakt het eenvoudiger om toegang te krijgen tot de eigenschappen en methoden van één object, zodat je de naam van het object niet in elke uitdrukking hoeft te herhalen. Alle verwijzingen binnen het blok verwijzen naar het opgegeven object.
Voorbeeld van gebruik:
With myCustomer .Name = "Ivanov" .Balance += 1000 .LastPurchase = Now End With
Voordelen:
Vraag: Is het mogelijk om één With-blok in een ander te nestelen? Wat gebeurt er met verwijzingen naar eigenschappen en methoden binnen het geneste blok?
Antwoord: Ja, nesting is mogelijk. Maar binnen het interne blok wordt een puntverwijzing (.) geïnterpreteerd met betrekking tot het interne object. Als je dezelfde eigenschapsnaam gebruikt, ontstaat er ambiguïteit.
With obj1 .Value = 10 With obj2 .Value = 20 ' Dit is obj2.Value, niet obj1.Value End With End With
Verhaal
In het geneste With-gedeelte werden eigenschappen met dezelfde naam in verschillende objecten gebruikt, en de ontwikkelaar verwachtte dat de toewijzing invloed zou hebben op het externe object. Als gevolg hiervan werden de gegevens verkeerd geschreven, het probleem kwam pas aan het licht bij het genereren van een complex rapport, toen de waardes door elkaar waren gehaald.
Verhaal
Bij het refactoren van de code werden de eindblokken End With verwisseld. In een groot codefragment leidde dit ertoe dat expressies naar een andere (al gesloten) instantie van het object begonnen te verwijzen, in plaats van naar de verwachte, wat leidde tot uitvoeringsfouten en moeilijk te traceren bugs.
Verhaal
In businesslogica werd With gebruikt voor geneste collecties. Na het bijwerken van de klassenstructuur werd een nieuwe eigenschap met een naam toegevoegd die overeenkwam met de eigenschappen van het interne object, wat leidde tot een conflict en een compilatiefout, die niet opgemerkt werd door het ontbreken van unit-tests voor deze gevallen.