Freigeben über


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 verhindern Mehrdeutigkeit und vereinfachen Verweise bei verwendung großer Gruppen von Objekten wie Klassenbibliotheken.

Beispielsweise definiert .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 behandeln ein Problem, das manchmal als Namespaceverschmutzung bezeichnet wird, in dem der Entwickler einer Klassenbibliothek durch die Verwendung ähnlicher Namen in einer anderen Bibliothek behindert wird. Diese Konflikte mit vorhandenen Komponenten werden manchmal als Namenskonflikte bezeichnet.

Wenn Sie beispielsweise eine neue Klasse mit dem Namen ListBoxerstellen, können Sie sie in Ihrem Projekt ohne Qualifikation verwenden. Wenn Sie jedoch die .NET Framework-Klasse ListBox im selben Projekt verwenden möchten, müssen Sie einen vollqualifizierten Verweis verwenden, um den Verweis eindeutig zu machen. Wenn der Verweis nicht eindeutig ist, erzeugt Visual Basic einen Fehler, der angibt, dass der Name mehrdeutig ist. Im folgenden Codebeispiel wird veranschaulicht, wie diese Objekte deklariert werden:

' 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 ein Objekt mit dem Namen ListBoxenthalten:

Screenshot mit zwei Namespacehierarchien.

Standardmäßig enthält jede ausführbare Datei, die Sie mit Visual Basic erstellen, einen Namespace mit demselben Namen wie Ihr Projekt. Wenn Sie z. B. ein Objekt innerhalb eines Projekts mit dem Namen ListBoxProjectdefinieren, enthält die ausführbare Datei ListBoxProject.exe einen Namespace namens ListBoxProject.

Mehrere Assemblys können denselben Namespace verwenden. Visual Basic behandelt sie als eine einzelne Gruppe von Namen. Sie können beispielsweise Klassen für einen Namespace namens SomeNameSpace in einer Assembly mit dem Namen Assemb1 definieren und zusätzliche Klassen für denselben Namespace aus einer Assembly mit dem Namen Assemb2 definieren.

Vollqualifizierte Namen

Vollqualifizierte Namen sind Objektverweise, die dem Namen des Namespaces vorangestellt sind, in dem das Objekt definiert ist. Sie können objekte verwenden, die in anderen Projekten definiert sind, wenn Sie einen Verweis auf die Klasse erstellen (indem Sie im Menü Projekt "Verweis hinzufügen" auswählen) und dann den vollqualifizierten Namen für das Objekt in Ihrem Code verwenden. Das folgende Codefragment zeigt, wie der vollqualifizierte Name für ein Objekt aus dem Namespace eines anderen Projekts verwendet wird:

Dim LBC As New ListBoxProject.Form1.ListBox

Vollqualifizierte Namen verhindern Namenskonflikte, da sie es dem Compiler ermöglichen, zu bestimmen, welches Objekt verwendet wird. Die Namen selbst können jedoch lang und umständlich werden. Um dies zu umgehen, können Sie die Imports Anweisung verwenden, um einen Alias zu definieren – einen abgekürzten Namen, den Sie anstelle eines vollqualifizierten Namens verwenden können. Im folgenden Codebeispiel werden beispielsweise Aliase für zwei vollqualifizierte Namen erstellt und diese Aliase verwendet, um zwei Objekte zu definieren.

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 für das 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, ihn ohne vollständige Qualifizierung zu verwenden Class1 , erzeugt Visual Basic einen Fehler, der angibt, dass der Name Class1 mehrdeutig ist.

Namespaceebenen-Anweisungen

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

Das Schlüsselwort „global“ in vollqualifizierten Namen

Wenn Sie eine geschachtelte Hierarchie von Namespaces definiert haben, kann der Zugriff auf den System Namespace von .NET Framework durch Code innerhalb dieser Hierarchie blockiert werden. Das folgende Beispiel veranschaulicht eine Hierarchie, in der der SpecialSpace.System Namensraum 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  

Daher kann der Visual Basic-Compiler den Verweis System.Int32 nicht erfolgreich auflösen, weil SpecialSpace.SystemInt32 nicht definiert. Sie können das Global Schlüsselwort verwenden, um die Qualifikationskette auf der äußersten Ebene der .NET Framework-Klassenbibliothek zu starten. Auf diese Weise können Sie den System Namespace oder einen anderen Namespace in der Klassenbibliothek angeben. Im folgenden Beispiel wird dies 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 Namensräume auf Stammebene zuzugreifen, wie z.B. Microsoft.VisualBasic, und alle Namensräume, die Ihrem Projekt zugeordnet sind.

Global-Schlüsselwort in Namespace-Anweisungen

Sie können das Global Schlüsselwort auch in einer Namespace-Anweisung verwenden. Auf diese Weise können Sie einen Namespace aus dem Stammnamespace Ihres Projekts definieren.

Alle Namespaces in Ihrem Projekt basieren auf dem Stammnamespace für das Projekt. Visual Studio weist Den Projektnamen als Standardstammnamespace für den gesamten Code in Ihrem Projekt zu. Wenn Ihr Projekt beispielsweise benannt ConsoleApplication1ist, gehören die Programmierelemente zum Namespace ConsoleApplication1. Wenn Sie Namespace Magnetospheredeklarieren, greifen Verweise auf Magnetosphere im Projekt auf ConsoleApplication1.Magnetospherezu.

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

Sie können die Anwendungsseite, Project Designer (Visual Basic) verwenden, um den Stammnamespace des Projekts anzuzeigen und zu ändern. Bei neuen Projekten ist der Stammnamespace standardmäßig auf den Projektnamen festgelegt. Um Global zum Namespace der obersten Ebene zu machen, können Sie den Stammnamespace-Eintrag löschen, damit das Feld leer ist. Durch das Löschen des Stammnamespaces wird die Notwendigkeit des Global Schlüsselworts in Namespacedeklarationen entfernt.

Wenn eine Namespace Anweisung einen Namen deklariert, der auch ein Namespace im .NET Framework ist, wird der .NET Framework-Namespace nicht verfügbar, wenn das Global Schlüsselwort nicht in einem vollqualifizierten Namen verwendet wird. Um den Zugriff auf diesen .NET Framework-Namespace zu ermöglichen, ohne das Global Schlüsselwort zu verwenden, können Sie das Global Schlüsselwort in die Namespace Anweisung einschließen.

Das folgende Beispiel weist das Global Schlüsselwort in der System.Text Namespacedeklaration auf.

Wenn das Global Schlüsselwort in der Namespacedeklaration nicht vorhanden war, kann auf StringBuilder ohne Angabe von Global.System.Text.StringBuilder nicht zugegriffen werden. Bei einem Projekt mit dem Namen ConsoleApplication1 würden Verweise auf System.Text auf ConsoleApplication1.System.Text zugreifen, wenn das Global Schlüsselwort nicht eingesetzt wäre.

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