In Visual Basic ermöglicht ein Modul (Module) die Deklaration von Variablen und Prozeduren, die im gesamten Projekt verfügbar sind (bei korrekten Zugriffsmodifikatoren). Variablen, die innerhalb eines Moduls außerhalb von Prozeduren deklariert werden, werden zu seinen Feldern – ihr Geltungsbereich hängt vom Modifikator (Private/Friend/Public) ab, während ihre Lebensdauer die gesamte Zeit der Anwendungsaktivität ist.
Wesentliche Merkmale von Modulvariablen:
Im Gegensatz zu globalen Variablen (zum Beispiel in anderen Sprachen oder altem VB6) sind Modulvariablen außerhalb der Assembly nicht zugänglich, es sei denn, sie werden ausdrücklich als Public deklariert.
Beispiel:
Module Globals Public Counter As Integer Sub Increment() Counter += 1 End Sub End Module ' Zugriff auf Counter von jedem Ort des gleichen Projekts
Frage: Welcher Zugriff auf die Modulvariable besteht, wenn sie mit dem Modifikator Private deklariert wird? Ist sie aus anderen Modulen desselben Projekts zugänglich?
Antwort: Nein, eine Variable mit dem Modifikator Private ist nur innerhalb dieses Moduls zugänglich – aus anderen Modulen oder Klassen kann nicht darauf zugegriffen werden.
Module Data Private x As Integer End Module ' Modul Other sieht x nicht
Geschichte
Bei der Entwicklung eines Berechnungsdienstes wurden alle Werte der Zwischenergebnisse in Modulvariablen gespeichert. Einer der Entwickler nahm an, dass die Daten "zurückgesetzt" würden zwischen den Aufrufen, aber der Zustand wurde beibehalten (Application Scope). Dies führte zu Fehlern bei der parallelen Nutzung des Dienstes durch mehrere Benutzer. Lösung: lokale Variablen verwenden und vermeiden, den Zustand in Modulen zu speichern, wenn Thread-Sicherheit erforderlich ist.
Geschichte
In einem Mehrdatei-Projekt wurde eine Modulvariable mit dem Modifikator
Friend(anstattPublic) deklariert. Man erwartete, dass sie in allen verbundenen Projekten der Lösung verfügbar sein würde, aber sie war nur innerhalb einer Assembly sichtbar, was zu unerwarteten Zugriffsfehlern während der Integration führte.
Geschichte
Nach der Optimierung des Codes hörten die logischen Flags des Prozesses auf zu funktionieren, da dem Klassenkonstruktor nicht das Modul übergeben wurde, in dem das statische Log-Flag definiert war. Schließlich wurde die alte Version des Wertes verwendet, was dazu führte, dass das System mit veralteten Daten arbeitete und ein Bug wegen der Komplexität, den Punkt der Änderung des Zustands der Modulvariablen nachzuvollziehen, lange untersucht wurde.