Поделиться через


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

Полные квалифицированные имена

Полные имена — это ссылки на объекты, префиксированные именем пространства имен, в котором определен объект. Объекты, определенные в других проектах, можно использовать, если вы создаете ссылку на класс (выбрав "Добавить ссылку " в меню Project ), а затем используйте полное имя объекта в коде. В следующем фрагменте кода показано, как использовать полное имя объекта из пространства имен другого проекта:

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 неоднозначно.

Инструкции уровня пространства имен

В пространстве имен можно определить такие элементы, как модули, интерфейсы, классы, делегаты, перечисления, структуры и другие пространства имен. Нельзя определить такие элементы, как свойства, процедуры, переменные и события на уровне пространства имен. Эти элементы должны быть объявлены в контейнерах, таких как модули, структуры или классы.

Глобальное ключевое слово в полных именах

Если вы определили вложенную иерархию пространств имен, код внутри этой иерархии может быть заблокирован для доступа к 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 слово в инструкции пространства имен. Это позволяет определить пространство имен из корневого пространства имен проекта.

Все пространства имен в проекте основаны на корневом пространстве имен для проекта. Visual Studio назначает имя проекта в качестве корневого пространства имен по умолчанию для всего кода в проекте. Например, если проект называется ConsoleApplication1, его элементы программирования принадлежат пространству имен ConsoleApplication1. Если вы объявите Namespace Magnetosphere, ссылки на Magnetosphere в проекте будут обращаться к ConsoleApplication1.Magnetosphere.

В следующих примерах ключевое слово Global используется для объявления пространства имен вне корневого пространства имен проекта.

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

В объявлении пространства имен Global не может быть вложено в другое пространство имен.

Вы можете использовать страницу приложения, конструктор проектов (Visual Basic) для просмотра и изменения корневого пространства имен проекта. Для новых проектов корневое пространство имен по умолчанию использует имя проекта. Чтобы сделать Global пространством имен верхнего уровня, можно очистить запись Root Namespace, чтобы поле было пустым. Очистка корневого пространства имен устраняет необходимость использования ключевого слова 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

См. также