In Visual Basic stelt een module (Module) je in staat om variabelen en procedures te declareren die beschikbaar zijn in het hele project (met de juiste toegangsmodifiers). Variabelen die binnen een module buiten procedures zijn gedeclareerd, worden de velden ervan – hun zichtbaarheid hangt af van de modifier (Private/Friend/Public), en de levensduur is voor de hele duur van de applicatie.
Belangrijke kenmerken van module variabelen:
In tegenstelling tot globale variabelen (bijvoorbeeld in andere talen of oud VB6), zijn module variabelen niet toegankelijk buiten de assembly, tenzij ze expliciet als Public zijn gedeclareerd.
Voorbeeld:
Module Globals Public Counter As Integer Sub Increment() Counter += 1 End Sub End Module ' Toegang tot Counter vanuit elke plek in hetzelfde project
Vraag: Welke toegang heeft een modulevariabele bij declaratie met de modifier Private? Is deze toegankelijk vanuit andere modules van hetzelfde project?
Antwoord: Nee, een variabele met de modifier Private is alleen toegankelijk binnen deze module – het is niet mogelijk om vanuit andere modules of klassen er toegang toe te krijgen.
Module Data Private x As Integer End Module ' Module Other zal x niet kunnen zien
Verhaal
Tijdens de ontwikkeling van de rekendienst werden alle waarden van tussenresultaten opgeslagen in modulevariabelen. Een van de ontwikkelaars ging ervan uit dat de gegevens "zouden worden gereset" tussen aanroepen, maar de toestand werd behouden (Application Scope). Dit leidde tot fouten bij gelijktijdig gebruik van de dienst door meerdere gebruikers. Oplossing: gebruik lokale variabelen en vermijd het opslaan van toestand in modules als thread-veiligheid vereist is.
Verhaal
In een multi-bestand project was de modulevariabele gedeclareerd met de modifier
Friend(in plaats vanPublic). Men verwachtte dat deze toegankelijk zou zijn in alle gerelateerde projecten van de oplossing, maar deze bleek alleen zichtbaar te zijn binnen één assembly, wat onverwachte toegangsfouten veroorzaakte tijdens de integratiefase.
Verhaal
Na optimalisatie van de code stopten de logische vlaggen van het proces met werken, omdat de constructeur van de klasse de module waar de statische log-vlag was gedefinieerd niet ontving. Hierdoor werd een oude versie van de waarde gebruikt, waardoor het systeem met verouderde gegevens werkte, en de bug lange tijd onderzocht werd vanwege de complexiteit van het volgen van het punt van verandering van de toestand van de modulevariabele.