W Visual Basic moduł (Module) pozwala na deklarowanie zmiennych i procedur, które są dostępne w całym projekcie (przy odpowiednich modyfikatorach dostępu). Zmienne zadeklarowane wewnątrz modułu poza procedurami stają się jego polami – ich zakres widoczności zależy od modyfikatora (Private/Friend/Public), a czas życia – na cały okres działania aplikacji.
Kluczowe cechy zmiennych modułowych:
W przeciwieństwie do zmiennych globalnych (na przykład w innych językach lub starym VB6), zmienne modułowe nie są dostępne poza zestawem, jeśli nie są jawnie zadeklarowane jako Public.
Przykład:
Module Globals Public Counter As Integer Sub Increment() Counter += 1 End Sub End Module ' Dostęp do Counter z dowolnego miejsca w tym samym projekcie
Pytanie: Jaki dostęp do zmiennej modułowej będzie przy jej zadeklarowaniu z modyfikatorem Private? Czy jest dostępna z innych modułów tego samego projektu?
Odpowiedź: Nie, zmienna z modyfikatorem Private jest dostępna tylko wewnątrz tego modułu – nie można się do niej odwołać z innych modułów ani klas.
Module Data Private x As Integer End Module ' Moduł Other nie zobaczy x
Historia
Podczas opracowywania usługi rozliczeniowej wszystkie wartości pośrednich rezultatów były przechowywane w zmiennych modułowych. Jeden z programistów zakładał, że dane "zresetują się" między wywołaniami, ale stan był przechowywany (Application Scope). Doprowadziło to do błędów przy równoległym korzystaniu z usługi przez wielu użytkowników. Rozwiązanie: używać zmiennych lokalnych i unikać przechowywania stanu w modułach, jeśli wymagana jest bezpieczeństwo wątków.
Historia
W projekcie wielofajłowym zmienna modułowa została zadeklarowana z modyfikatorem
Friend(zamiastPublic). Oczekiwano, że będzie dostępna we wszystkich powiązanych projektach rozwiązania, ale okazało się, że była widoczna tylko wewnątrz jednego zestawu, co spowodowało niespodziewane błędy dostępu na etapie integracji.
Historia
Po optymalizacji kodu przestały działać logiczne flagi procesu, ponieważ konstruktor klasy nie otrzymał modułu, w którym zdefiniowana jest statyczna flaga log. W rezultacie używana była stara wersja wartości, przez co system pracował z przestarzałymi danymi, a błąd długo badano z powodu trudności w śledzeniu miejsca zmiany stanu zmiennej modułowej.