Operator With...End With pozwala uprościć dostęp do właściwości i metod jednego obiektu, aby nie powtarzać nazwy obiektu w każdym wyrażeniu. Wszystkie odwołania wewnątrz bloku odnoszą się do wskazanego obiektu.
Przykład użycia:
With myCustomer .Name = "Ivanov" .Balance += 1000 .LastPurchase = Now End With
Zalety:
Pytanie: Czy można zagnieździć jeden blok With w innym? Co się dzieje z odwołaniami do właściwości i metod w zagnieżdżonym bloku?
Odpowiedź: Tak, zagnieżdżenie jest możliwe. Jednak wewnątrz wewnętrznego bloku odniesienie z kropką (.) będzie interpretowane w odniesieniu do wewnętrznego obiektu. Jeśli użyjesz takiej samej nazwy właściwości, powstanie niejasność.
With obj1 .Value = 10 With obj2 .Value = 20 ' To jest obj2.Value, a nie obj1.Value End With End With
Historia
W zagnieżdżonym bloku With użyto właściwości o tej samej nazwie w różnych obiektach, a programista oczekiwał, że przypisanie wpłynie na zewnętrzny obiekt. W rezultacie dane były zapisywane w niewłaściwe miejsce, problem ujawnił się dopiero podczas generowania złożonego raportu, gdy wartości zostały pomieszane.
Historia
Podczas refaktoryzacji kodu pomylono zakończenia bloków End With. W dużym fragmencie kodu doprowadziło to do tego, że wyrażenia zaczęły odnosić się do innego (już zamkniętego) egzemplarza obiektu, a nie do oczekiwanego, co prowadziło do błędów wykonania i trudnych do zidentyfikowania błędów.
Historia
W logice biznesowej używano With dla zagnieżdżonych kolekcji. Po aktualizacji struktury klasy dodano nową właściwość o nazwie, która pokrywała się z właściwościami wewnętrznego obiektu, co spowodowało konflikt i błąd kompilacji, niezauważony z powodu braku testów jednostkowych dla tych przypadków.