ПрограммированиеVB.NET бизнес-приложение

Объясните, как работает оператор With...End With в Visual Basic, в чём его польза и какие подводные камни таит использование вложенных конструкций With?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Оператор 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-тестов для этих случаев.