Пространства имен в Visual Basic
Пространства имен упорядочивают объекты, определенные в сборке. Сборки могут содержать несколько пространств имен, которые, в свою очередь, могут содержать другие пространства имен. Пространства имен предотвращают неоднозначность и упрощают ссылки при использовании больших групп объектов, таких как библиотеки классов.
Например, платформа .NET Framework определяет ListBox класс в System.Windows.Forms пространстве имен. В следующем фрагменте кода показано, как объявить переменную, используя полное имя для этого класса:
Dim LBox As System.Windows.Forms.ListBox
Предотвращение конфликтов имен
платформа .NET Framework пространства имен решают проблему, которая иногда называется загрязнением пространства имен, в котором разработчик библиотеки классов препятствует использованию аналогичных имен в другой библиотеке. Такие конфликты с существующими компонентами иногда называют конфликтами имен.
Например, если вы создаете новый класс ListBox
, то можете использовать его внутри проекта без уточнения. Однако если вы хотите использовать класс платформа .NET Framework ListBox в том же проекте, необходимо использовать полную ссылку, чтобы сделать ссылку уникальной. Если ссылка не является уникальной, Visual Basic создает ошибку, указывающую, что имя неоднозначно. В примере кода ниже показано, как объявить эти объекты:
' 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
На следующем рисунке показаны две иерархии пространства имен, содержащие объект с именем ListBox
:
По умолчанию каждый исполняемый файл, создаваемый с помощью Visual Basic, содержит пространство имен с тем же именем, что и проект. Например, если вы определяете объект в проекте ListBoxProject
, то исполняемый файл ListBoxProject.exe содержит пространство имен ListBoxProject
.
Несколько сборок могут использовать одно и то же пространство имен. Visual Basic обрабатывает их как один набор имен. Например, можно определить классы для пространства имен SomeNameSpace
в сборке Assemb1
, а также определить дополнительные классы для того же пространства имен из сборки Assemb2
.
полные имена
Полные имена — это ссылки на объекты, имеющие префикс в виде имени пространства имен, в котором определен объект. Вы можете использовать объекты, определенные в других проектах, если создадите ссылку на класс (выбрав Добавить ссылку в меню Проект ) и затем используете полное имя объекта в коде. В следующем фрагменте кода показано, как использовать полное имя объекта из пространства имен другого проекта:
Dim LBC As New ListBoxProject.Form1.ListBox
Полные имена предотвращают возникновение конфликтов имен, так как позволяют компилятору определить, какой именно объект используется. Однако сами эти имена могут получиться длинными и громоздкими. Чтобы обойти эту проблему, можно использовать оператор Imports
для определения псевдонима— сокращенного имени, которое можно применить вместо полного имени. Например, в следующем примере кода создаются псевдонимы для двух полных имен, которые затем используются для определения двух объектов.
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox
Если вы применяете оператор Imports
без псевдонима, можно использовать все имена в данном пространстве имен без уточнения при условии, что они являются уникальными в данном проекте. Если проект содержит операторы Imports
для пространств имен, где есть элементы с одинаковым именем, необходимо полностью уточнять это имя. Предположим, что проект содержал два следующих оператора Imports
:
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
Если вы пытаетесь использовать Class1
без полной квалификации, Visual Basic создает ошибку, указывающую, что имя Class1
неоднозначно.
Операторы уровня пространства имен
В пространстве имен можно определить такие элементы, как модули, интерфейсы, классы, делегаты, перечисления, структуры и другие пространства имен. Вы не можете определить такие элементы, как свойства, процедуры, переменные и события, на уровне пространства имен. Их следует объявить внутри контейнеров, таких как модули, структуры или классы.
Ключевое слово Global в полных именах
Если вы определили вложенную иерархию пространств имен, доступ кода внутри этой иерархии к пространству имен System платформы .NET Framework может быть заблокирован. В следующем примере показана иерархия, где пространство имен SpecialSpace.System
блокирует доступ к 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
В результате компилятору Visual Basic не удается разрешить успешно ссылку в System.Int32, так как SpecialSpace.System
не определяет Int32
. Можно использовать ключевое слово Global
для запуска цепочки квалификации на самом внешнем уровне библиотеки классов .NET Framework. Это позволяет указать пространство имен System или любое другое пространство имен в библиотеке классов. Это показано в следующем примере.
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
Можно использовать Global
для доступа к другим пространствам имен корневого уровня, таким как Microsoft.VisualBasic, и любому пространству имен, сопоставленному с проектом.
Ключевое слово Global в операторах пространства имен
Можно также использовать ключевое слово Global
в Namespace Statement. Это позволяет определить пространство имен из корневых пространств имен проекта.
Все пространства имен в проекте основаны на его корневом пространстве имен. Visual Studio назначает имя проекта в качестве корневого пространства имен по умолчанию для всего кода в проекте. Например, если проект называется ConsoleApplication1
, его программные элементы относятся к пространству имен ConsoleApplication1
. При объявлении Namespace Magnetosphere
ссылки на Magnetosphere
в проекте будут обращаться к ConsoleApplication1.Magnetosphere
.
В следующих примерах используется ключевое слово Global
для объявления пространства имен из корневого пространства имен для проекта.
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
В объявлении пространства имен Global
не может быть вложенным в другое пространство имен.
Вы можете использовать Application Page, Project Designer (Visual Basic) для просмотра и изменения значения Корневое пространство имен проекта. Для новых проектов параметру Корневое пространство имен по умолчанию присваивается имя проекта. Чтобы сделать Global
пространством имен верхнего уровня, можно очистить запись Корневое пространство имен , оставив поле пустым. Очистка значения Корневое пространство имен избавляет от необходимости использовать ключевое слово Global
в объявлениях пространств имен.
Когда оператор Namespace
объявляет имя, которое также является пространством имен в платформе .NET Framework, пространство имен .NET Framework станет недоступным, если в полном имени не используется ключевое слово Global
. Для обеспечения доступа к пространству имен .NET Framework без использования ключевого слова Global
можно включить ключевое слово Global
в оператор Namespace
.
В следующем примере ключевое слово Global
присутствует в объявлении пространства имен System.Text
.
Если ключевое слово Global
отсутствует в объявлении пространства имен, к StringBuilder нельзя обратиться без указания Global.System.Text.StringBuilder
. Если ключевое слово ConsoleApplication1
не использовалось, для проекта с именем System.Text
ссылки на ConsoleApplication1.System.Text
обращаются к Global
.
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