Оператор With...End With позволяет упростить доступ к свойствам и методам одного объекта, чтобы не повторять имя объекта в каждом выражении. Все обращения внутри блока ссылаются на указанный объект.
Пример использования:
With myCustomer .Name = "Иванов" .Balance += 1000 .LastPurchase = Now End With
Польза:
Вопрос: Можно ли вложить один блок With в другой? Что происходит с обращениями к свойствам и методам во вложенном блоке?
Ответ: Да, вложение возможно. Но внутри внутреннего блока обращение с точкой (.) будет трактоваться относительно внутреннего объекта. Если использовать такое же имя свойства, возникнет двусмысленность.
With obj1 .Value = 10 With obj2 .Value = 20 ' Это obj2.Value, а не obj1.Value End With End With
История
Во вложенном With-разделе были использованы свойства с одинаковым именем в различных объектах, и разработчик ожидал, что присваивание повлияет на внешний объект. В результате данные писались не туда, проблема проявилась только при генерации сложного отчёта, когда значения оказались перепутаны.
История
При рефакторинге кода перепутали окончания блоков End With. В большом фрагменте кода это привело к тому, что выражения начали ссылаться на другой (уже закрытый) экземпляр объекта, а не на ожидаемый, что привело к ошибкам исполнения и трудноуловимым багам.
История
В бизнес-логике использовался With для вложенных коллекций. После обновления структуры класса добавили новое свойство с именем, совпадающим со свойствами внутреннего объекта, что вызвало конфликт и ошибку компиляции, незамеченную из-за отсутствия unit-тестов для этих случаев.