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
:
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 Assemb1
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ść 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 Int32
elementu . 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 Magnetosphere
odwołania do Magnetosphere
elementu w projekcie będą uzyskiwać dostęp do ConsoleApplication1.Magnetosphere
elementu .
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 ConsoleApplication1
odwoł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