Namespaces in Visual Basic

Namespaces organisieren die in einer Assembly definierten Objekte. Assemblys können mehrere Namespaces enthalten, die wiederum andere Namespaces enthalten können. Namespaces vermeiden Mehrdeutigkeit und vereinfachen Verweise, wenn Sie große Gruppen von Objekten verwenden, zum Beispiel Klassenbibliotheken.

Zum Beispiel definiert das .NET Framework die ListBox -Klasse im System.Windows.Forms-Namespace. Das folgende Codefragment zeigt, wie eine Variable mit dem vollqualifizierten Namen für diese Klasse deklariert wird:

Dim LBox As System.Windows.Forms.ListBox

Vermeiden von Namenskonflikten

.NET Framework-Namespaces beheben ein Problem (gelegentlich als Namespaceverunreinigung bezeichnet), bei dem Entwickler*innen einer Klassenbibliothek durch die Verwendung ähnlicher Namen in einer anderen Bibliothek in ihrer Arbeit behindert werden. Diese Konflikte mit vorhandenen Komponenten werden auch als Namenskonfliktebezeichnet.

Angenommen, Sie erstellen eine neue Klasse namens ListBox, können Sie sie innerhalb des Projekts ohne Qualifikation verwenden. Wenn Sie jedoch die .NET Framework-Klasse ListBox im selben Projekt nutzen möchten, müssen Sie einen vollqualifizierten Verweis verwenden, um den Verweis eindeutig zu kennzeichnen. Ist der Verweis nicht eindeutig, gibt Visual Basic eine Fehlermeldung mit dem Hinweis aus, dass der Name zweideutig ist. Im folgenden Codebeispiel wird die Deklaration dieser Objekte veranschaulicht:

' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox

Die folgende Abbildung zeigt zwei Namespacehierarchien, die beide ein Objekt namens ListBox enthalten:

Screenshot that shows two namespace hierarchies.

Standardmäßig enthält jede ausführbare Datei, die Sie mit Visual Basic erstellen, einen Namespace mit demselben Namen wie Ihr Projekt. Wenn Sie zum Beispiel ein Objekt in einem Projekt mit dem Namen ListBoxProjectdefinieren, enthält die ausführbare Datei ListBoxProject.exe einen Namespace mit dem Namen ListBoxProject.

Mehrere Assemblys können den gleichen Namen verwenden. In Visual Basic werden diese als ein einzelner Satz von Namen betrachtet. Zum Beispiel können Sie Klassen für einen Namespace mit dem Namen SomeNameSpace in einer Assembly mit dem Namen Assemb1definieren, und zusätzliche Klassen für den gleichen Namespace in einer Assembly mit dem Namen Assemb2.

Vollqualifizierte Namen

Vollqualifizierte Namen sind Objektverweise, denen der Name des Namespace vorangestellt ist, in dem das Objekt definiert ist. Sie können in anderen Projekten definierte Objekte verwenden, wenn Sie einen Verweis auf die Klasse erstellen (durch Auswahl von Verweis hinzufügen aus dem Menü Projekt ) und dann den vollqualifizierten Namen für das Objekt im Code verwenden. Das folgende Codefragment zeigt, wie Sie den vollqualifizierten Namen für ein Objekt aus dem Namespace eines anderen Projekts verwenden:

Dim LBC As New ListBoxProject.Form1.ListBox

Durch vollqualifizierte Namen werden Namenskonflikte vermieden, da der Compiler feststellen kann, welches Objekt verwendet wird. Die Namen selbst können jedoch lang und umständlich sein. Um dies zu umgehen, können Sie die Imports -Anweisung für die Definition eines Aliasverwenden. Diesen abgekürzten Namen können Sie anstelle eines vollqualifizierten Namens verwenden. Das folgende Codebeispiel erstellt Aliase für zwei vollqualifizierte Namen und verwendet diese Aliase zur Definition zweier Objekte.

Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox

Wenn Sie die Imports -Anweisung ohne Alias verwenden, können Sie alle Namen in diesem Namespace ohne Qualifikation verwenden – vorausgesetzt, sie sind in dem Projekt eindeutig. Wenn das Projekt Imports -Anweisungen für Namespaces enthält, die Elemente mit gleichem Namen enthalten, müssen Sie Namen, die Sie verwenden, vollständig qualifizieren. Nehmen wir an, das Projekt enthält die folgenden beiden Imports -Anweisungen:

' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

Wenn Sie versuchen, Class1 ohne vollständige Qualifizierung zu verwenden, werden sie von Visual Basic in einer Fehlermeldung darauf hingewiesen, dass der Name Class1 zweideutig ist.

Namespaceebenen-Anweisungen

Innerhalb eines Namespace können Sie Elemente wie Module, Schnittstellen, Klassen, Delegaten, Enumerationen, Strukturen und andere Namespaces definieren. Sie können keine Elemente wie Eigenschaften, Prozeduren, Variablen und Ereignisse auf Namespaceebene definieren. Diese Elemente müssen in Containern, beispielsweise in Modulen, Strukturen oder Klassen deklariert werden.

Das Schlüsselwort „global“ in vollqualifizierten Namen

Wenn Sie eine geschachtelte Hierarchie aus Namespaces definiert haben, kann der Zugriff auf den System -Namespace von .NET Framework für Code innerhalb dieser Hierarchie blockiert sein. Das folgende Beispiel veranschaulicht eine Hierarchie, in der der SpecialSpace.System -Namespace den Zugriff auf Systemblockiert.

Namespace SpecialSpace  
    Namespace System  
        Class abc  
            Function getValue() As System.Int32  
                Dim n As System.Int32  
                Return n  
            End Function  
        End Class  
    End Namespace  
End Namespace  

Der Visual Basic-Compiler kann daher den Verweis auf System.Int32nicht auflösen, da SpecialSpace.System kein Int32definiert. Sie können das Schlüsselwort Global verwenden, um die Qualifikationskette in der äußersten Ebene der .NET Framework-Klassenbibliothek zu beginnen. Dadurch können Sie den System -Namespace oder irgendeinen anderen Namespace in der Klassenbibliothek angeben. Dies wird anhand des folgenden Beispiels veranschaulicht.

Namespace SpecialSpace  
    Namespace System  
        Class abc  
            Function getValue() As Global.System.Int32  
                Dim n As Global.System.Int32  
                Return n  
            End Function  
        End Class  
    End Namespace  
End Namespace  

Sie können Global verwenden, um auf andere Namespaces auf Stammebene zuzugreifen, beispielsweise auf Microsoft.VisualBasic, und auf jeden anderen Namespace, der dem Projekt zugeordnet ist.

Global-Schlüsselwort in Namespace-Anweisungen

Sie können auch das Schlüsselwort Global in einem Namespace Statementbezeichnet. Dadurch können Sie einen Namespace aus dem Stammnamespace des Projekts definieren.

Alle Namespaces im Projekt basieren auf dem Stammnamespace des Projekts. Visual Studio weist den Projektnamen als den Standard-Stammnamespace für den gesamten Code des Projekts zu. Wenn Ihr Projekt beispielsweise den Namen ConsoleApplication1hat, gehören die Programmierelemente zum Namespace ConsoleApplication1. Wenn Sie Namespace Magnetospheredeklarieren, greifen Verweise auf Magnetosphere im Projekt auf ConsoleApplication1.Magnetospherezu.

Die folgenden Beispiele verwenden das Schlüsselwort Global , um einen Namespace aus dem Stammnamespace für das Projekt zu deklarieren.

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

In einer Namespace-Deklaration kann Global nicht in einem anderen Namespace geschachtelt sein.

Sie können Application Page, Project Designer (Visual Basic) zum Anzeigen und Ändern des Stammnamespace des Projekts verwenden. Bei neuen Projekten erhält der Stammnamespace standardmäßig den Namen des Projekts. Damit Global der Namespace der obersten Ebene ist, können Sie den Stammnamespace -Eintrag löschen, so dass das Feld leer ist. Löschen des Stammnamespace beseitigt die Notwendigkeit des Schlüsselworts Global in Namespacedeklarationen.

Wenn eine Namespace -Anweisung einen Namen deklariert, der auch ein Namespace in .NET Framework ist, ist der .NET Framework-Namespace nicht mehr verfügbar, wenn das Schlüsselwort Global nicht in einem vollständig qualifizierten Namen verwendet wird. Um den Zugriff auf diesen .NET Framework-Namespace ohne die Verwendung des Schlüsselworts Global zu aktivieren, können Sie das Schlüsselwort Global in die Namespace -Anweisung aufnehmen.

Das folgende Beispiel enthält in der Namespacedeklaration Global das Schlüsselwort System.Text .

Wenn das Schlüsselwort Global nicht in der Namespacedeklaration enthalten ist, kann auf StringBuilder nicht zugegriffen werden, ohne dass Global.System.Text.StringBuilderfestgelegt wird. Für ein Projekt mit dem Namen ConsoleApplication1greifen Verweise auf System.Text auf ConsoleApplication1.System.Text zu, wenn das Schlüsselwort Global nicht verwendet wurde.

Module Module1
    Sub Main()
        Dim encoding As New System.Text.TitanEncoding

        ' If the namespace defined below is System.Text
        ' instead of Global.System.Text, then this statement
        ' causes a compile-time error.
        Dim sb As New System.Text.StringBuilder
    End Sub
End Module

Namespace Global.System.Text
    Class TitanEncoding

    End Class
End Namespace

Siehe auch