L'operatore With...End With consente di semplificare l'accesso alle proprietà e ai metodi di un oggetto, riducendo la necessità di ripetere il nome dell'oggetto in ogni espressione. Tutti i riferimenti all'interno del blocco si riferiscono all'oggetto specificato.
Esempio di utilizzo:
With myCustomer .Name = "Ivanov" .Balance += 1000 .LastPurchase = Now End With
Vantaggi:
Domanda: È possibile annidare un blocco With all'interno di un altro? Cosa succede ai riferimenti alle proprietà e ai metodi nel blocco annidato?
Risposta: Sì, l'annidamento è possibile. Tuttavia, all'interno del blocco interno, i riferimenti con il punto (.) saranno interpretati rispetto all'oggetto interno. Se si utilizza lo stesso nome di proprietà, si verificherà un'ambiguità.
With obj1 .Value = 10 With obj2 .Value = 20 ' Questo è obj2.Value, non obj1.Value End With End With
Storia
Nel blocco With annidato sono state utilizzate proprietà con lo stesso nome in oggetti diversi, e lo sviluppatore si aspettava che l'assegnazione influenzasse l'oggetto esterno. Di conseguenza, i dati sono stati scritti nel posto sbagliato, il problema si è manifestato solo durante la generazione di un report complesso, quando i valori risultavano confusi.
Storia
Durante il refactoring del codice, sono stati confusi i termini di chiusura dei blocchi End With. In un ampio frammento di codice, ciò ha portato a riferimenti a un'altra istanza (già chiusa) dell'oggetto, e non a quella attesa, causando errori di esecuzione e bug difficili da individuare.
Storia
Nella logica aziendale è stato utilizzato With per collezioni annidate. Dopo l'aggiornamento della struttura della classe, è stata aggiunta una nuova proprietà con un nome che coincideva con le proprietà dell'oggetto interno, generando un conflitto e un errore di compilazione, non notato a causa dell'assenza di test unitari per questi casi.