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:
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 ListBoxProject
definieren, 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 Assemb1
definieren, 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 Int32
definiert. 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 ConsoleApplication1
hat, gehören die Programmierelemente zum Namespace ConsoleApplication1
. Wenn Sie Namespace Magnetosphere
deklarieren, greifen Verweise auf Magnetosphere
im Projekt auf ConsoleApplication1.Magnetosphere
zu.
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.StringBuilder
festgelegt wird. Für ein Projekt mit dem Namen ConsoleApplication1
greifen 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