Пространства имен в 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:

Screenshot that shows two namespace hierarchies.

По умолчанию каждый исполняемый файл, создаваемый с помощью 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

См. также