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 und Loop

  • For [Each] und Next

  • If und End If

  • Select und End Select

  • SyncLock und End SyncLock

  • Try und End Try

  • While und End While

  • With und End 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 jedes intTemp-Element als lokale Variable deklariert wird, erkennt jede Prozedur nur ihre eigene Version von intTemp. Jede Prozedur kann den Wert im lokalen intTemp-Element ändern, ohne intTemp-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- oder Static-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.

Weitere Informationen