В Visual Basic модуль (Module) позволяет объявлять переменные и процедуры, доступные во всём проекте (при правильных модификаторах доступа). Переменные, объявленные внутри модуля вне процедур, становятся его полями – их область видимости зависит от модификатора (Private/Friend/Public), а время жизни – на всё время работы приложения.
Ключевые особенности модульных переменных:
В отличие от глобальных переменных (например, в других языках или старом VB6), модульные переменные не доступны вне сборки, если явно не объявлены как Public.
Пример:
Module Globals Public Counter As Integer Sub Increment() Counter += 1 End Sub End Module ' Доступ к Counter из любого места того же проекта
Вопрос: Какой доступ к модульной переменной будет при объявлении её с модификатором Private? Доступна ли она из других модулей того же проекта?
Ответ: Нет, переменная с модификатором Private доступна только внутри этого модуля – из других модулей или классов к ней обратиться нельзя.
Module Data Private x As Integer End Module ' Module Other не увидит x
История
При разработке расчётного сервиса все значения промежуточных результатов сохранялись в модульных переменных. Один из разработчиков предполагал, что данные "сбросятся" между вызовами, но состояние сохранялось (Application Scope). Это привело к ошибкам при параллельном использовании сервиса несколькими пользователями. Решение: использовать локальные переменные и избегать хранения состояния в модулях, если требуется потокобезопасность.
История
В многофайловом проекте модульная переменная была объявлена с модификатором
Friend(вместоPublic). Ожидали, что она будет доступна во всех связанных проектах решения, но она оказалась видимой только внутри одной сборки, что вызвало неожиданные ошибки доступа на этапе интеграции.
История
После оптимизации кода перестали работать логические флаги процесса, так как конструктору класса не передавался модуль, где определён статический лог-флаг. В итоге использовалась старая версия значения, из-за чего система работала с устаревшими данными, а баг долго расследовали из-за сложности отслеживания точки изменения состояния модульной переменной.