Auflösen eines Verweises bei mehreren Variablen mit gleichem Namen

Aktualisiert: November 2007

Wenn der Compiler einen Namensverweis einer Namensdeklaration zuordnet, sucht er nach der passenden Deklaration mit dem engsten Gültigkeitsbereich. Das bedeutet, er beginnt mit dem Code, der den Verweis enthält, und arbeitet nacheinander, von innen nach außen, die einzelnen Ebenen der enthaltenden Elemente ab.

Wenn Sie diesen Suchprozess überschreiben und einen Namen angeben möchten, der in einem weiteren Gültigkeitsbereich deklariert wurde, müssen Sie den Namen mit dem enthaltenden Element des weiteren Gültigkeitsbereichs qualifizieren. In manchen Fällen muss auch das enthaltende Element qualifiziert werden. Weitere Informationen zur Namensqualifikation finden Sie unter Gewusst wie: Qualifizieren eines deklarierten Elementnamens.

Wenn die Anwendung Zugriff auf mehrere Programmierelemente mit dem gleichen Namen hat, müssen Sie unter Umständen auch einen Namensverweis qualifizieren. Beispiele finden Sie unter "Klassen mit demselben Namen" auf dieser Hilfeseite und unter Gewusst wie: Unterscheiden zwischen zwei Elementen mit dem gleichen Namen.

Engster Gültigkeitsbereich

Im folgenden Beispiel sehen Sie Verweise auf zwei Variablen mit dem gleichen Namen.

' Assume these two modules are both in the same assembly.
Module container
    Public totalCount As Integer = 1
    Public Sub showCount()
        Dim totalCount As Integer = 6000
        ' The following statement displays the local totalCount (6000).
        MsgBox("Unqualified totalCount is " & CStr(totalCount))
        ' The following statement displays the module's totalCount (1).
        MsgBox("container.totalCount is " & CStr(container.totalCount))
    End Sub
End Module
Module callingModule
    Public Sub displayCount()
        container.showCount()
        ' The following statement displays the containing module's totalCount (1).
        MsgBox("container.totalCount is " & CStr(container.totalCount))
    End Sub
End Module

Im vorhergehenden Beispiel werden zwei Variablen, die beide den Namen totalCount tragen, in unterschiedlichen Bereichsebenen im container-Modul deklariert. Wenn die showCount-Prozedur totalCount ohne Qualifizierung anzeigt, löst der Visual Basic-Compiler den Verweis in die Deklaration mit dem engsten Gültigkeitsbereich auf, nämlich die lokale Deklaration in showCount. Wenn totalCount mit dem enthaltenden Modul container qualifiziert wird, löst der Compiler den Verweis in die Deklaration mit dem weiteren Bereich auf.

Member anderer enthaltender Elemente

Wenn Sie einen nicht freigegebenen Member einer anderen Klasse oder Struktur verwenden, müssen Sie den Membernamen zunächst mit einer Variablen oder einem Ausdruck qualifizieren, der auf eine Instanz der entsprechenden Klasse bzw. Struktur verweist. Im folgenden Beispiel ist demoClass eine Instanz einer Klasse mit der Bezeichnung class1.

Dim demoClass As class1 = New class1()
demoClass.someSub[(argumentlist)]

Sie können nicht den Klassennamen selbst verwenden, um einen Member zu qualifizieren, der nicht als Shared (Visual Basic) deklariert wurde. Sie müssen zunächst eine Instanz in einer Objektvariablen erstellen (in diesem Fall demoClass) und anschließend mit dem Variablennamen darauf verweisen.

Wenn eine Klasse oder Struktur einen Shared-Member besitzt, können Sie diesen Member entweder mit dem Klassen- oder Strukturnamen oder mit einer Variablen oder einem Ausdruck qualifizieren, der auf eine Instanz verweist.

Ein Modul besitzt keine separaten Instanzen, und alle Member sind standardmäßig Shared. Deshalb qualifizieren Sie einen Modulmember mit dem Modulnamen.

Beispiel eines qualifizierten Verweises

Im folgenden Beispiel werden qualifizierte Verweise auf Modulmemberprozeduren gezeigt.

' Assume these three modules are all in the same assembly.
Module module1
    Public Sub perform()
        MsgBox("module1.perform() now returning")
    End Sub
End Module
Module module2
    Public Sub perform()
        MsgBox("module2.perform() now returning")
    End Sub
    Public Sub doSomething()
        ' The following statement calls perform in module2, the active module.
        perform()
        ' The following statement calls perform in module1.
        module1.perform()
    End Sub
End Module
Module module3
    Public Sub callPerform()
        ' The following statement calls perform in module1.
        module1.perform()
        ' The following statement makes an unresolvable name reference
        ' and therefore generates a COMPILER ERROR.
        perform() ' INVALID statement
    End Sub
End Module

Im vorhergehenden Beispiel werden zwei Sub-Prozeduren, die beide den Namen perform tragen, in verschiedenen Modulen eines Projekts deklariert. Beide können innerhalb des eigenen Moduls ohne zusätzliche Qualifizierung angegeben werden, bei einem Verweis von einer anderen Stelle aus müssen sie jedoch qualifiziert werden. Da der letzte Verweis in module3perform nicht qualifiziert, kann der Compiler diesen Verweis nicht auflösen.

Verweise auf Projekte

Um Public (Visual Basic)-Elemente zu verwenden, die in einem anderen Projekt definiert wurden, müssen Sie zunächst einen Verweis auf die Assembly oder die Typbibliothek dieses Projekts festlegen. Wenn Sie einen Verweis festlegen möchten, klicken Sie im Menü Projekt auf die Auswahl Verweis hinzufügen, oder verwenden Sie die Option /reference (Visual Basic) des Befehlszeilencompilers.

Sie können beispielsweise das XML-Objektmodell von .NET Framework verwenden. Wenn Sie einen Verweis auf den System.Xml-Namespace festlegen, können Sie alle seine Klasse deklarieren und verwenden, z. B. XmlDocument. Im folgenden Beispiel wird XmlDocument verwendet.

' Assume this project has a reference to System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As System.Xml.XmlDocument

Importieren von enthaltenden Elementen

Sie können Imports-Anweisung (.NET-Namespace und Typ) zum Importieren der Namespaces verwenden, die die zu verwendenden Module oder Klassen enthalten. Dies ermöglicht einen Verweis auf die in einem importierten Namespace definierten Elemente ohne vollständige Qualifizierung ihrer Namen. Im folgenden Beispiel wird das vorhergehende Beispiel neu geschrieben, um den System.Xml-Namespace zu importieren.

' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As XmlDocument

Darüber hinaus kann die Imports-Anweisung einen Importalias für jeden importierten Namespace definieren. Dadurch kann der Quellcode verkürzt und somit leichter lesbar gestaltet werden. Im folgenden Beispiel wird das vorhergehende Beispiel neu geschrieben, um xD als Alias für den System.Xml-Namespace zu verwenden.

' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports xD = System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As xD.XmlDocument

Mit der Imports-Anweisung werden Ihrer Anwendung keine Elemente aus anderen Projekten zur Verfügung gestellt. Das heißt, sie ersetzt nicht das Festlegen eines Verweises. Der Import eines Namespace befreit lediglich von der Erfordernis, die in diesem Namespace definierten Namen zu qualifizieren.

Sie können die Imports-Anweisung auch dazu verwenden, Module, Klassen, Strukturen und Enumerationen zu importieren. Danach können die Member der importierten Elemente ohne Qualifizierung verwendet werden. Nicht freigegebene Member von Klassen und Strukturen müssen allerdings immer mit einer Variablen oder einem Ausdruck qualifiziert werden, der eine Instanz dieser Klasse oder Struktur auswertet.

Klassen mit demselben Namen

Wenn Sie eine neue Instanz eines Objekts erstellen, müssen Sie die Klasse u. U. mit dem Namespace bzw. der Typbibliothek qualifizieren, zu dem bzw. der sie gehört. Der System.Windows.Forms-Namespace und der System.Web.UI.WebControls-Namespace enthalten z. B. beide eine Label-Klasse (System.Windows.Forms.Label und System.Web.UI.WebControls.Label). Wenn in der Anwendung beide verwendet werden oder eine eigene Label-Klasse definiert wird, müssen die verschiedenen Label-Objekte voneinander unterschieden werden. Geben Sie den Namespace oder den Importalias in der Variablendeklaration an. Im folgenden Beispiel wird der Importalias verwendet.

' The following statement must precede all your declarations.
Imports win = System.Windows.Forms, web = System.Web.UI.WebControls
' The following statement references the Windows.Forms.Label class.
Dim winLabel As New win.Label()

Richtlinien für die Benennung

Wenn Sie zwei oder mehr Programmierelemente mit demselben Namen definieren, kann dies zu einer Namensmehrdeutigkeit führen, wenn der Compiler versucht, einen Verweis zu diesem Namen aufzulösen. Wenn sich mehrere Definitionen oder gar keine Definition im Gültigkeitsbereich befinden, kann der Verweis nicht aufgelöst werden. Ein Beispiel finden Sie unter "Beispiel eines qualifizierten Verweises " auf dieser Hilfeseite.

Eine Namensmehrdeutigkeit kann verhindert werden, indem Sie allen Elementen eindeutige Namen zuweisen. Auf diese Weise können Sie auf ein beliebiges Element verweisen, ohne seinen Namen mit einem Namespace, einem Modul oder einer Klasse zu qualifizieren. Sie reduzieren auch die Wahrscheinlichkeit, versehentlich auf das falsche Element zu verweisen.

Siehe auch

Aufgaben

Gewusst wie: Ändern von Projekteigenschaften und Konfigurationseinstellungen

Gewusst wie: Qualifizieren eines deklarierten Elementnamens

Gewusst wie: Unterscheiden zwischen zwei Elementen mit dem gleichen Namen

Konzepte

Variablen in Visual Basic

Referenz

Imports-Anweisung (.NET-Namespace und Typ)

New (Visual Basic)

Public (Visual Basic)

Weitere Ressourcen

Verweise auf deklarierte Elemente