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.

Namespacehierarchie

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 in der vollqualifizierte Name

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 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.

Globales Schlüsselwort in den Namespace-Anweisungen

Sie können das Global-Schlüsselwort in A verwenden. Namespace-Anweisung Dadurch können Sie einen Namespace aus dem Stammnamespace des Projekts Bereichs definieren.

Alle Namespaces im Projekt basieren auf den Stammnamespace für das Projekt. Visual Studio weist den Projektnamen als Standardstammnamespace für den gesamten Code in diesem Projekt zu. Wenn der Name des Projekts z. B. ConsoleApplication1 lautet, gehören die Programmierelemente des Projekts zu dem Namespace ConsoleApplication1. Wenn Sie Namespace Magnetospheredeklarieren, greifen Verweise auf Magnetosphere im Projekt ConsoleApplication1.Magnetosphere.

In den folgenden Beispielen werden die Global-Schlüsselwort, 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 Namespacedeklaration kann Global nicht in einem anderen Namespace geschachtelt werden.

Sie können auch verwenden Seite "Anwendung", Projekt-Designer (Visual Basic), um Stammnamespace des Projekts anzuzeigen und zu ändern. Eine neue Projekte führt Stammnamespace auf dem Projektnamen. Um Global dass der Namespace der obersten Ebene befinden, können Sie den Stammnamespace Eintrag löschen, damit das Feld leer ist. Löschen Stammnamespace entfernt die Anforderung für das Global-Schlüsselwort in den Namespacedeklarationen.

Wenn eine Namespace-Anweisung deklariert einen Namen zu, der auch einen Namespace in .NET Framework ist, wird der .NET Framework-Namespace nicht verfügbar, wenn das Global-Schlüsselwort nicht in einem vollqualifizierten Namens verwendet wird. Um Zugriff auf diesen .NET Framework-Namespace ohne das Schlüsselwort Global Verwendung zu ermöglichen, können Sie das Global-Schlüsselwort in der Namespace-Anweisung einfügen.

Im folgenden Beispiel verfügt das Global-Schlüsselwort in der System.Text-Namespacedeklaration.

Wenn das Global-Schlüsselwort nicht in der Namespacedeklaration vorhanden war, konnte StringBuilder nicht zugegriffen werden, ohne Global.System.Text.StringBuilderanzugeben. Für ein Projekt, das ConsoleApplication1benannt wurde, werden Verweise auf System.TextConsoleApplication1.System.Text zugreifen, wenn das Global-Schlüsselwort 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

Aufgaben

Gewusst wie: Erstellen und Verwenden von Assemblys über die Befehlszeile (C# und Visual Basic)

Referenz

Imports-Anweisung (.NET-Namespace und Typ)

ListBox

System.Windows.Forms

Konzepte

Assemblys und der globale Assemblycache (C# und Visual Basic)

Verweise und die Imports-Anweisung (Visual Basic)

Schreiben von Code in Office-Projektmappen