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 uniemożliwiają niejednoznaczność i upraszczają odwołania podczas korzystania z dużych grup obiektów, takich jak biblioteki klas.

Na przykład program .NET Framework definiuje klasę ListBoxSystem.Windows.Forms w przestrzeni nazw. 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:

Screenshot that shows two namespace hierarchies.

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 i zdefiniować dodatkowe klasy dla tej samej przestrzeni nazw z zestawu o nazwie Assemb1Assemb2.

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ść ten proces, 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 instrukcje dla przestrzeni nazw, które zawierają elementy o tej samej nazwie, należy w pełni zakwalifikować 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 polecenia bez pełnej jego kwalifikacji, program Visual Basic generuje błąd informują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 w pełni kwalifikowanych nazwach

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

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. Ilustruje to poniższy przykład.

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 polecenia , aby uzyskać dostęp do innych przestrzeni nazw na poziomie głównym, takich jak Microsoft.VisualBasic, i dowolnej przestrzeni nazw skojarzonej z projektem.

Globalne słowo kluczowe w instrukcjach 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 przestrzeń nazw katalogu głównego projektu.

Wszystkie przestrzenie nazw w projekcie są oparte na głównej przestrzeni nazw projektu. Program Visual Studio przypisuje nazwę projektu jako domyślną przestrzeń nazw katalogu głównego 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 Magnetosphereodwołania do Magnetosphere elementu w projekcie będą uzyskiwać dostęp do ConsoleApplication1.Magnetosphereelementu .

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

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

W deklaracji Global przestrzeni nazw nie można zagnieżdżać w innej przestrzeni nazw.

Możesz użyć strony aplikacji, projektu Projektant (Visual Basic), aby wyświetlić i zmodyfikować przestrzeń nazw głównych projektu. W przypadku nowych projektów główna przestrzeń nazw jest domyślnie nazwą projektu. Aby spowodować Global , że jest to przestrzeń nazw najwyższego poziomu, 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ć Global słowo kluczowe w instrukcji Namespace .

Poniższy przykład zawiera Global słowo kluczowe w deklaracji System.Text przestrzeni nazw.

Jeśli słowo Global kluczowe nie było obecne w deklaracji przestrzeni nazw, StringBuilder nie można uzyskać dostępu bez określenia Global.System.Text.StringBuilder. W przypadku projektu o nazwie ConsoleApplication1odwołania do metody System.Text będą miały dostęp ConsoleApplication1.System.Text , jeśli Global słowo kluczowe 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 też