Freigeben über


Gültigkeitsbereich in Visual Basic

Der Bereich eines deklarierten Elements ist die Menge aller Codes, die darauf verweisen können, ohne seinen Namen zu qualifizieren oder es über eine Imports-Anweisung (.NET-Namespace und -Typ) verfügbar zu machen. Ein Element kann einen Bereich auf einer der folgenden Ebenen aufweisen:

Niveau BESCHREIBUNG
Blockbereich Nur innerhalb des Codeblocks verfügbar, in dem er deklariert wird
Prozedurbereich Verfügbar für den gesamten Code innerhalb der Prozedur, in der sie deklariert wird
Modulbereich Verfügbar für den gesamten Code innerhalb des Moduls, der Klasse oder der Struktur, in der er deklariert wird
Namespacebereich Verfügbar für den gesamten Code im Namespace, in dem er deklariert wird

Diese Ebenen des Bereichsfortschritts vom schmalsten (Block) zum weitesten (Namespace), wobei der schmalste Bereich den kleinsten Codesatz bedeutet, der ohne Qualifikation auf das Element verweisen kann. Auf dieser Seite finden Sie unter 'Ebenen des Bereichs' weitere Informationen.

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 Bereich (Block, Prozedur, Modul, Klasse oder Struktur), in dem Sie das Element deklarieren

  • Der Namespace, der die Deklaration des Elements enthält

  • Die Zugriffsstufe, die Sie für das Element deklarieren

Verwenden Sie die Sorgfalt, wenn Sie Variablen mit demselben Namen, aber unterschiedlichen Bereich definieren, da dies zu unerwarteten Ergebnissen führen kann. Weitere Informationen finden Sie unter Verweise auf deklarierte Elemente.

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 den Namen qualifizieren zu müssen.

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 Gültigkeitsbereich der ganzzahligen Variable cube der Block zwischen If und End If, und Sie können cube nicht mehr darauf 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, ist die Lebensdauer der gesamten Prozedur noch vorhanden. Wenn Sie den Block während der Prozedur mehrmals eingeben, behält jede Blockvariable den vorherigen Wert bei. Um unerwartete Ergebnisse in einem solchen Fall zu vermeiden, ist es ratsam, Blockvariablen am Anfang des Blocks zu initialisieren.

Prozedurumfang

Ein in einer Prozedur deklariertes Element ist außerhalb dieser Prozedur nicht verfügbar. Nur die Prozedur, die die Deklaration enthält, kann sie verwenden. Variablen auf dieser Ebene werden auch als lokale Variablen bezeichnet. Sie deklarieren sie mit der Dim-Anweisung mit oder ohne das Static-Schlüsselwort .

Der Prozedurbereich und der Blockbereich sind eng miteinander verknüpft. Wenn Sie eine Variable innerhalb einer Prozedur, aber außerhalb eines Blocks innerhalb dieser Prozedur deklarieren, können Sie sich die Variable als Blockbereich vorstellen, wobei der Block die gesamte Prozedur ist.

Hinweis

Alle lokalen Elemente, auch wenn sie Variablen sind Static , sind privat für die Prozedur, in der sie angezeigt werden. Sie können kein Element mithilfe des Schlüsselworts Public innerhalb einer Prozedur deklarieren.

Modulbereich

Der Einfachheit halber gilt der Begriff der Modulebene gleichermaßen für Module, Klassen und Strukturen. Sie können Elemente auf dieser Ebene deklarieren, indem Sie die Deklarationsanweisung außerhalb einer Prozedur oder eines Blocks, jedoch 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 private Zugriffsebene deklarieren, stehen für jede Prozedur in diesem Modul, aber nicht für Code in einem anderen Modul zur Verfügung. Die Dim-Anweisung auf Modulebene wird standardmäßig zu Private gesetzt, wenn Sie keine Schlüsselwörter auf Zugriffsebene verwenden. Sie können den Bereich und die Zugriffsebene jedoch deutlicher machen, indem Sie das Private Schlüsselwort in der Dim Anweisung verwenden.

Im folgenden Beispiel können alle im Modul definierten Prozeduren auf die Zeichenfolgenvariable strMsgverweisen. Wenn die zweite Prozedur aufgerufen wird, wird der Inhalt der Zeichenfolgenvariable 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

Geltungsbereich des Namespace

Wenn Sie ein Element auf Modulebene mit dem Schlüsselwort Friend oder Public deklarieren, wird es für alle Prozeduren im gesamten Namespace verfügbar, in dem das Element deklariert wird. Mit der folgenden Änderung des vorherigen Beispiels kann die Zeichenfolgenvariable strMsg von Code an einer beliebigen Stelle im Namespace der Deklaration referenziert 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 Namespace-Anweisungenenthält, befindet sich alles im Projekt im selben Namespace. In diesem Fall kann der Namensraum als Projektbereich betrachtet werden. Public Elemente in einem Modul, einer Klasse oder einer Struktur stehen auch allen Projekten zur Verfügung, die auf ihr Projekt verweisen.

Auswahl des Bereichs

Wenn Sie eine Variable deklarieren, sollten Sie beim Auswählen des Bereichs die folgenden Punkte berücksichtigen.

Vorteile lokaler Variablen

Lokale Variablen sind aus folgenden Gründen eine gute Wahl für jede Art temporärer Berechnungen:

  • Namenskonfliktvermeidung. Lokale Variablennamen sind nicht anfällig für Konflikte. Sie können beispielsweise mehrere Prozeduren erstellen, die eine Variable namens intTemp enthalten. Solange jede intTemp als lokale Variable deklariert wird, erkennt jede Prozedur nur ihre eigene Version von intTemp. Jede Prozedur kann den Wert in ihrem lokalen intTemp ändern, ohne intTemp Variablen in anderen Prozeduren zu beeinträchtigen.

  • Arbeitsspeicherverbrauch. Lokale Variablen verbrauchen nur Arbeitsspeicher, während ihre Prozedur ausgeführt wird. Ihr Arbeitsspeicher wird freigegeben, wenn die Prozedur zum aufrufenden Code zurückkehrt. Im Gegensatz dazu verbrauchen freigegebene und statische Variablen Arbeitsspeicherressourcen, bis die Anwendung nicht mehr ausgeführt wird. Verwenden Sie sie daher nur bei Bedarf. Instanzenvariablen verbrauchen Arbeitsspeicher, während ihre Instanz weiterhin vorhanden ist, wodurch sie weniger effizient als lokale Variablen, aber potenziell effizienter als Shared oder Static Variablen sind.

Minimieren des Umfangs

Im Allgemeinen ist es eine gute Vorgehensweise in der Programmierung, beim Deklarieren einer Variablen oder Konstanten den Bereich so schmal wie möglich zu gestalten (der Blockbereich ist der engste). Dies trägt dazu bei, Arbeitsspeicher zu sparen und die Wahrscheinlichkeit zu minimieren, dass der Code falsch auf die falsche Variable verweist. Ebenso sollten Sie eine Variable nur dann als statisch deklarieren, wenn sie erforderlich ist, um den Wert zwischen Prozeduraufrufen beizubehalten.

Siehe auch