Namespaces in Visual Basic
Die in einer Assembly definierten Objekte werden in Namespaces organisiert. Assemblys können mehrere Namespaces enthalten, die ihrerseits weitere Namespaces umfassen können. Durch Namespaces wird Mehrdeutigkeit vermieden und das Erstellen von Verweisen in umfangreichen Objektgruppen, wie Klassenbibliotheken, erleichtert.
In .NET Framework wird z. B. die ListBox-Klasse im System.Windows.Forms-Namespace definiert. Das folgende Codefragment zeigt die Deklaration einer Variablen mit dem vollgekennzeichneten Namen für diese Klasse:
Dim LBox As System.Windows.Forms.ListBox
Vermeiden von Namenskonflikten
.NET Framework-Namespaces greifen das zuweilen als Namespaceverunreinigung bezeichnete Problem auf, bei dem der Entwickler einer Klassenbibliothek durch die Verwendung ähnlicher Namen in einer anderen Bibliothek gestört wird. Diese Konflikte mit vorhandenen Komponenten werden auch als Namenskollisionen bezeichnet.
Wenn Sie z. B. eine neue Klasse mit dem Namen ListBox erstellen, können Sie ohne Qualifikation im Projekt darauf zugreifen. Wenn Sie jedoch im gleichen Projekt die ListBox-Klasse von .NET Framework verwenden möchten, müssen Sie einen vollqualifizierten Verweis erstellen, damit der Verweis eindeutig ist. Wenn der Verweis nicht eindeutig ist, gibt Visual Basic eine Fehlermeldung mit dem Hinweis aus, dass der Name mehrdeutig ist. Das folgende Codebeispiel zeigt die Deklaration dieser Objekte:
' 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
In der folgenden Abbildung werden zwei Namespacehierarchien aufgeführt, die beide ein Objekt mit dem Namen ListBox enthalten.
Standardmäßig enthält jede ausführbare Datei, die mit Visual Basic erstellt wird, einen Namespace mit demselben Namen wie das Projekt. Wenn Sie ein Objekt z. B. in einem Projekt mit dem Namen ListBoxProject definieren, enthält die ausführbare Datei ListBoxProject.exe den Namespace ListBoxProject.
Mehrere Assemblys können den gleichen Namespace verwenden. Visual Basic behandelt diese als einzelnen Namenssatz. Sie können z. B. in der Assembly Assemb1 Klassen für den Namespace SomeNameSpace erstellen und dann in der Assembly Assemb2 weitere Klassen für denselben Namespace definieren.
Vollgekennzeichnete Namen
Vollqualifizierte Namen sind Objektverweise, denen der Name des Namespaces vorangestellt wird, in dem das Objekt definiert ist. Durch Erstellen eines Verweises auf die jeweilige Klasse können Sie in anderen Projekten definierte Objekte verwenden. Klicken Sie dazu im Menü Projekt auf Verweis hinzufügen, und tragen Sie dann den vollgekennzeichneten Namen des Objekts in den Code ein. Das folgende Codefragment zeigt die Verwendung des vollgekennzeichneten Namens eines Objekts im Namespace eines anderen Projekts:
Dim LBC As New ListBoxProject.Form1.ListBox
Mit vollqualifizierten Namen werden Namenskonflikte verhindert, da der Compiler mit ihnen bestimmen kann, welches Objekt verwendet wird. Die Namen selbst werden jedoch häufig lang und unübersichtlich. Um dieses Problem zu umgehen, können Sie mit der Imports-Anweisung einen Alias definieren, ein Kurzname, der anstelle des vollqualifizierten Namens verwendet werden kann. Im folgenden Codebeispiel werden Aliase für zwei vollqualifizierte Namen erstellt, mit denen dann zwei Objekte definiert werden.
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 auf alle Namen in diesem Namespace ohne Qualifizierung zugreifen, vorausgesetzt, sie sind in dem Projekt eindeutig. Wenn das Projekt Imports-Anweisungen für Namespaces enthält, die Elemente mit gleichem Namen umfassen, müssen Sie einen solchen Namen vollgekennzeichnet angeben. Angenommen, das Projekt enthält die beiden folgenden Imports-Anweisungen:
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
Wenn versucht wird, ohne Vollqualifizierung auf Class1 zuzugreifen, gibt Visual Basic eine Fehlermeldung mit dem Hinweis aus, dass der Name Class1 mehrdeutig ist.
Anweisungen auf Namespaceebene
Innerhalb eines Namespaces können Sie Elemente wie Module, Schnittstellen, Klassen, Delegate, Enumerationen, Strukturen und andere Namespaces definieren. Sie können auf Namespaceebene keine Elemente wie Eigenschaften, Prozeduren, Variablen und Ereignisse definieren. Diese Elemente müssen in Containern, z. B. Modulen, Strukturen oder Klassen, deklariert werden.
Globales Schlüsselwort
Wenn Sie eine geschachtelte Hierarchie aus Namespaces definiert haben, kann Code innerhalb dieser Hierarchie möglicherweise nicht auf den System-Namespace von .NET Framework zugreifen. Im folgenden Beispiel wird eine Hierarchie gezeigt, in der der SpecialSpace.System-Namespace den Zugriff auf System blockiert.
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
Folglich kann der Visual Basic-Compiler den Verweis auf System.Int32 nicht auflösen, weil Int32 von SpecialSpace.System nicht definiert wird. Sie können das Global-Schlüsselwort verwenden, um die Qualifikationskette an der äußersten Ebene der .NET Framework-Klassenbibliothek zu beginnen. Dies ermöglicht es Ihnen, den System-Namespace oder irgendeinen anderen Namespace in der Klassenbibliothek anzugeben. 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, z. B. Microsoft.VisualBasic, sowie auf jeden anderen Namespace, der dem Projekt zugeordnet ist.
Siehe auch
Aufgaben
Gewusst wie: Erstellen und Verwenden von Assemblys über die Befehlszeile (C# und Visual Basic)
Referenz
Assemblys und der globale Assemblycache (C# und Visual Basic)
Imports-Anweisung (.NET-Namespace und Typ)