Udostępnij za pomocą


Przestrzenie nazw w Visual Basic

Przestrzenie nazw organizują obiekty zdefiniowane w zestawie. Zestawy mogą zawierać wiele przestrzeni nazw, które z kolei mogą zawierać inne przestrzenie nazw. Przestrzenie nazw zapobiegają niejednoznaczności i upraszczają odwołania podczas korzystania z dużych grup obiektów, takich jak biblioteki klas.

Na przykład .NET Framework definiuje klasę ListBox w przestrzeni nazw System.Windows.Forms. Poniższy fragment kodu pokazuje, jak zadeklarować zmienną przy użyciu w pełni kwalifikowanej nazwy dla tej klasy:

Dim LBox As System.Windows.Forms.ListBox

Unikanie kolizji nazw

Przestrzenie nazw programu .NET Framework dotyczą problemu czasami nazywanego zanieczyszczeniem przestrzeni nazw, w którym deweloper biblioteki klas jest utrudniony przez użycie podobnych nazw w innej bibliotece. Konflikty z istniejącymi składnikami są czasami nazywane kolizjami nazw.

Jeśli na przykład utworzysz nową klasę o nazwie ListBox, możesz użyć jej w projekcie bez kwalifikacji. Jeśli jednak chcesz użyć klasy .NET Framework ListBox w tym samym projekcie, musisz użyć w pełni kwalifikowanego odwołania, aby utworzyć unikatowe odwołanie. Jeśli odwołanie nie jest unikatowe, program Visual Basic generuje błąd informujący, że nazwa jest niejednoznaczna. W poniższym przykładzie kodu pokazano, jak zadeklarować te obiekty:

' 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

Poniższa ilustracja przedstawia dwie hierarchie przestrzeni nazw, oba zawierające obiekt o nazwie ListBox:

Zrzut ekranu przedstawiający dwie hierarchie przestrzeni nazw.

Domyślnie każdy plik wykonywalny tworzony za pomocą języka Visual Basic zawiera przestrzeń nazw o takiej samej nazwie jak projekt. Jeśli na przykład zdefiniujesz obiekt w projekcie o nazwie ListBoxProject, plik wykonywalny ListBoxProject.exe zawiera przestrzeń nazw o nazwie ListBoxProject.

Wiele zestawów może używać tej samej przestrzeni nazw. Visual Basic traktuje je jako pojedynczy zestaw nazw. Można na przykład zdefiniować klasy dla przestrzeni nazw o nazwie SomeNameSpace w zestawie o nazwie Assemb1, oraz zdefiniować dodatkowe klasy dla tej samej przestrzeni nazw z zestawu o nazwie Assemb2.

W pełni kwalifikowane nazwy

W pełni kwalifikowane nazwy to odwołania do obiektów, które są poprzedzone nazwą przestrzeni nazw, w której zdefiniowano obiekt. Można użyć obiektów zdefiniowanych w innych projektach, jeśli utworzysz odwołanie do klasy (wybierając polecenie Dodaj odwołanie z menu Project ), a następnie użyj w pełni kwalifikowanej nazwy obiektu w kodzie. Poniższy fragment kodu pokazuje, jak używać w pełni kwalifikowanej nazwy obiektu z przestrzeni nazw innego projektu:

Dim LBC As New ListBoxProject.Form1.ListBox

W pełni kwalifikowane nazwy uniemożliwiają konflikty nazewnictwa, ponieważ umożliwiają kompilatorowi określenie, który obiekt jest używany. Jednak same nazwy mogą być długie i kłopotliwe. Aby obejść te przeszkody, możesz użyć Imports instrukcji, aby zdefiniować alias — skróconą nazwę, której można użyć zamiast w pełni kwalifikowanej nazwy. Na przykład poniższy przykład kodu tworzy aliasy dla dwóch w pełni kwalifikowanych nazw i używa tych aliasów do zdefiniowania dwóch obiektów.

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

Jeśli używasz instrukcji Imports bez aliasu, możesz użyć wszystkich nazw w tej przestrzeni nazw bez kwalifikacji, pod warunkiem, że są one unikatowe dla projektu. Jeśli projekt zawiera Imports deklaracje dla przestrzeni nazw, które zawierają elementy o tej samej nazwie, należy w pełni określić tę nazwę podczas jej używania. Załóżmy na przykład, że projekt zawierał następujące dwie Imports instrukcje:

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

Jeśli próbujesz użyć Class1 bez jego pełnej kwalifikacji, program Visual Basic generuje błąd stwierdzający, że nazwa Class1 jest niejednoznaczna.

Instrukcje na poziomie przestrzeni nazw

W przestrzeni nazw można definiować elementy, takie jak moduły, interfejsy, klasy, delegaty, wyliczenia, struktury i inne przestrzenie nazw. Nie można definiować elementów, takich jak właściwości, procedury, zmienne i zdarzenia na poziomie przestrzeni nazw. Te elementy muszą być zadeklarowane w kontenerach, takich jak moduły, struktury lub klasy.

Globalne słowo kluczowe w pełni kwalifikowanych nazwach

Jeśli zdefiniowano zagnieżdżoną hierarchię przestrzeni nazw, kod w tej hierarchii może zostać zablokowany przed uzyskaniem dostępu do przestrzeni nazw .NET Framework. Poniższy przykład ilustruje hierarchię, w której przestrzeń nazw SpecialSpace.System blokuje dostęp do System.

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  

W związku z tym kompilator języka Visual Basic nie może pomyślnie rozpoznać odwołania do System.Int32elementu , ponieważ SpecialSpace.System nie definiuje Int32elementu . Możesz użyć słowa kluczowego Global , aby uruchomić łańcuch kwalifikacji na najbardziej zewnętrznym poziomie biblioteki klas .NET Framework. Dzięki temu można określić System przestrzeń nazw lub dowolną inną przestrzeń nazw w bibliotece klas. Poniższy przykład ilustruje to.

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  

Możesz użyć Global do uzyskania dostępu do innych przestrzeni nazw na poziomie głównym, takich jak Microsoft.VisualBasic, oraz dowolnej przestrzeni nazw skojarzonej z projektem.

Globalne słowo kluczowe w deklaracjach przestrzeni nazw

Możesz również użyć słowa kluczowego Global w instrukcji Przestrzeni Nazw. Dzięki temu można zdefiniować przestrzeń nazw poza główną przestrzenią nazw projektu.

Wszystkie przestrzenie nazw w projekcie są oparte na głównej przestrzeni nazw projektu. Program Visual Studio przypisuje nazwę projektu jako domyślną główną przestrzeń nazw dla całego kodu w projekcie. Jeśli na przykład projekt ma nazwę ConsoleApplication1, jego elementy programowania należą do przestrzeni nazw ConsoleApplication1. W przypadku deklarowania Namespace Magnetosphere, odwołania do Magnetosphere w projekcie będą uzyskiwać dostęp do ConsoleApplication1.Magnetosphere.

W poniższych przykładach słowo kluczowe Global służy do deklarowania przestrzeni nazw z poza przestrzeni głównego projektu.

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

W deklaracji przestrzeni nazw Global nie może być zagnieżdżony w innej przestrzeni nazw.

Możesz użyć Strony Aplikacji, Projektanta Projektu (Visual Basic) do wyświetlania i modyfikacji głównej przestrzeni nazw projektu. W przypadku nowych projektów główna przestrzeń nazw jest domyślnie nazwą projektu. Aby sprawić, że Global stanie się główną przestrzenią nazw, możesz wyczyścić wpis Główna przestrzeń nazw, aby pole było puste. Wyczyszczenie głównej przestrzeni nazw usuwa potrzebę słowa kluczowego Global w deklaracjach przestrzeni nazw.

Namespace Jeśli instrukcja deklaruje nazwę, która jest również przestrzenią nazw w programie .NET Framework, przestrzeń nazw programu .NET Framework stanie się niedostępna, jeśli Global słowo kluczowe nie jest używane w w pełni kwalifikowanej nazwy. Aby umożliwić dostęp do tej przestrzeni nazw programu .NET Framework bez użycia słowa kluczowego Global, możesz dołączyć słowo kluczowe Global w deklaracji Namespace.

W poniższym przykładzie słowo kluczowe Global znajduje się w deklaracji przestrzeni nazw System.Text.

Jeśli kluczowe słowo Global nie było obecne w deklaracji przestrzeni nazw, nie można uzyskać dostępu do StringBuilder bez określenia Global.System.Text.StringBuilder. W przypadku projektu o nazwie ConsoleApplication1 odwołania do System.Text uzyskują dostęp do ConsoleApplication1.System.Text jeśli słowo kluczowe Global nie zostało użyte.

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

Zobacz także