Gültigkeitsbereich in Visual Basic
Der Bereich eines deklarierten Elements ist der Codesatz, der darauf verweisen kann, ohne seinen Namen zu qualifizieren oder über eine Imports-Anweisung (.NET-Namespace und -Typ) verfügbar zu machen. Ein Element kann einen Bereich auf einer der folgenden Ebenen aufweisen:
Ebene | BESCHREIBUNG |
---|---|
Blockbereich | Nur innerhalb des Codeblocks verfügbar, in dem die Deklaration erfolgt |
Prozedurbereich | Für den gesamten Code innerhalb der Prozedur verfügbar, in der die Deklaration erfolgt |
Modulbereich | Für den gesamten Code innerhalb des Moduls, der Klasse oder der Struktur verfügbar, in dem bzw. der die Deklaration erfolgt |
Namespacebereich | Für den gesamten Code im Namespace verfügbar, in dem die Deklaration erfolgt |
Diese Bereichsebenen reichen vom kleinsten (Block) bis zum größten (Namespace) Bereich, wobei kleinster Bereich die kleinste Menge an Code bedeutet, die sich ohne Qualifizierung auf das Element beziehen kann. Weitere Informationen finden Sie unter „Bereichsebenen“ auf dieser Seite.
Angeben des Bereichs und Definieren von Variablen
Sie geben den Bereich eines Elements an, wenn Sie es deklarieren. Der Bereich kann von den folgenden Faktoren abhängen:
Der Region (Block, Prozedur, Modul, Klasse oder Struktur), in der Sie das Element deklarieren
Dem Namespace, der die Deklaration des Elements enthält
Der Zugriffsebene, die Sie für das Element deklarieren
Gehen Sie mit Vorsicht vor, wenn Sie Variablen mit demselben Namen, aber unterschiedlichem Geltungsbereich definieren, da dies zu unerwarteten Ergebnissen führen kann. Weitere Informationen finden Sie unter References to Declared Elements.
Bereichsebenen
Ein Programmierelement ist in der gesamten Region verfügbar, in der Sie es deklarieren. Der gesamte Code in derselben Region kann auf das Element verweisen, ohne dessen Namen zu qualifizieren.
Blockbereich
Ein Block ist eine Reihe von Anweisungen, die in initiierende und beendende Deklarationsanweisungen eingeschlossen sind, z. B. die folgenden:
Do
undLoop
For
[Each
] undNext
If
undEnd If
Select
undEnd Select
SyncLock
undEnd SyncLock
Try
undEnd Try
While
undEnd While
With
undEnd With
Wenn Sie eine Variable innerhalb eines Blocks deklarieren, können Sie sie nur innerhalb dieses Blocks verwenden. Im folgenden Beispiel ist der Bereich der Integervariablen cube
der Block zwischen If
und End If
, und Sie können nicht mehr auf cube
verweisen, wenn die Ausführung den Block verlässt.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Hinweis
Auch wenn der Bereich einer Variablen auf einen Block beschränkt ist, entspricht ihre Lebensdauer weiterhin der gesamten Prozedur. Wenn Sie den Block während der Prozedur mehrmals aufrufen, behält jede Blockvariable ihren vorherigen Wert bei. Um unerwartete Ergebnisse in einem solchen Fall zu vermeiden, ist es ratsam, Blockvariablen am Anfang des Blocks zu initialisieren.
Prozedurbereich
Ein innerhalb einer Prozedur deklariertes Element ist außerhalb dieser Prozedur nicht verfügbar. Nur die Prozedur, die die Deklaration enthält, kann es verwenden. Variablen auf dieser Ebene werden auch als lokale Variablen bezeichnet. Sie deklarieren sie mit der Dim-Anweisung, mit oder ohne das statische Schlüsselwort .
Prozedur- und Blockbereich stehen in engem Zusammenhang. Wenn Sie eine Variable innerhalb einer Prozedur, aber außerhalb eines Blocks innerhalb dieser Prozedur deklarieren, können Sie sich die Variable als eine Variable mit Blockbereich vorstellen, wobei der Block die gesamte Prozedur darstellt.
Hinweis
Alle lokalen Elemente, auch wenn sie Static
-Variablen sind, sind für die Prozedur, in der sie verwendet werden, privat. Sie können kein Element mithilfe des Schlüsselworts Public innerhalb einer Prozedur deklarieren.
Modulbereich
Der Einfachheit halber gilt die Einzelbegriffsmodulebene gleichermaßen für Module, Klassen und Strukturen. Sie können Elemente auf dieser Ebene deklarieren, indem Sie die Deklarationsanweisung außerhalb einer beliebigen Prozedur oder eines Blocks, aber innerhalb des Moduls, der Klasse oder der Struktur platzieren.
Wenn Sie eine Deklaration auf Modulebene vornehmen, bestimmt die von Ihnen ausgewählte Zugriffsebene den Bereich. Der Namespace, der das Modul, die Klasse oder die Struktur enthält, wirkt sich auch auf den Bereich aus.
Elemente, für die Sie die private Zugriffsebene deklarieren, stehen für jede Prozedur in diesem Modul zur Verfügung, aber nicht für Code in einem anderen Modul. Die Dim
-Anweisung auf Modulebene ist standardmäßig auf Private
festgelegt, wenn Sie keine Schlüsselwörter auf Zugriffsebene verwenden. Sie können jedoch den Bereich und die Zugriffsebene deutlicher machen, indem Sie das Schlüsselwort Private
in der Dim
-Anweisung verwenden.
Im folgenden Beispiel können alle im Modul definierten Prozeduren auf die Zeichenfolgenvariable strMsg
verweisen. Wenn die zweite Prozedur aufgerufen wird, wird der Inhalt der Zeichenfolgenvariablen strMsg
in einem Dialogfeld angezeigt.
' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
MsgBox(strMsg)
End Sub
Namespacebereich
Wenn Sie ein Element auf Modulebene mithilfe des Friend- oder Public-Schlüsselworts deklarieren, wird es für alle Prozeduren im Namespace verfügbar, in dem das Element deklariert wird. Mit der folgenden Änderung am vorherigen Beispiel kann auf die Zeichenfolgenvariable strMsg
durch Code an einer beliebigen Stelle im Namespace ihrer Deklaration verwiesen werden.
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
Der Namespacebereich umfasst geschachtelte Namespaces. Ein Element, das in einem Namespace verfügbar ist, ist auch in jedem Namespace verfügbar, der in diesem Namespace geschachtelt ist.
Wenn Ihr Projekt keine Namespaceanweisungen enthält, befinden sich alle Elemente im Projekt im selben Namespace. In diesem Fall kann der Namespacebereich als Projektbereich betrachtet werden. Public
-Elemente in einem Modul, einer Klasse oder einer Struktur sind auch für jedes Projekt verfügbar, das auf das Projekt verweist.
Auswahl des Bereichs
Wenn Sie eine Variable deklarieren, sollten Sie die folgenden Punkte berücksichtigen, wenn Sie ihren Bereich auswählen.
Vorteile lokaler Variablen
Lokale Variablen sind aus den folgenden Gründen eine gute Wahl für jede Art von temporärer Berechnung:
Vermeidung von Namenskonflikten. Lokale Variablennamen sind nicht anfällig für Konflikte. Sie können beispielsweise mehrere verschiedene Prozeduren erstellen, die eine Variable mit dem Namen
intTemp
enthalten. Solange jedesintTemp
-Element als lokale Variable deklariert wird, erkennt jede Prozedur nur ihre eigene Version vonintTemp
. Jede Prozedur kann den Wert im lokalenintTemp
-Element ändern, ohneintTemp
-Variablen in anderen Prozeduren zu beeinflussen.Speicherverbrauch. Lokale Variablen belegen nur Arbeitsspeicher, während ihre Prozedur ausgeführt wird. Ihr Arbeitsspeicher wird freigegeben, wenn die Prozedur zum aufrufenden Code zurückkehrt. Im Gegensatz dazu nutzen Shared- und Static-Variablen Arbeitsspeicherressourcen, bis die Anwendung nicht mehr ausgeführt wird. Verwenden Sie sie daher nur bei Bedarf. Instanzvariablen verbrauchen Arbeitsspeicher, während ihre Instanz weiterhin vorhanden sind, wodurch sie weniger effizient als lokale Variablen, aber möglicherweise effizienter als
Shared
- oderStatic
-Variablen sind.
Minimieren des Bereichs
Im Allgemeinen empfiehlt es sich beim Deklarieren von Variablen oder Konstanten, den Bereich so klein wie möglich zu halten (der Blockbereich ist der kleinste). Dies trägt dazu bei, Arbeitsspeicher einzusparen und die Wahrscheinlichkeit zu minimieren, dass Ihr Code fälschlicherweise auf die falsche Variable verweist. Ebenso sollten Sie eine Variable nur dann als Static deklarieren, wenn ihr Wert zwischen Prozeduraufrufen beibehalten werden muss.