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


Пространства имен в Visual Basic

Пространства имен упорядочивают объекты, определенные в сборке. Сборки могут содержать несколько пространств имен, которые, в свою очередь, могут содержать другие пространства имен. Пространства имен предотвращают неоднозначность и упрощают ссылки при использовании больших групп объектов, таких как библиотеки классов.

Например, .NET Framework определяет класс ListBox в пространстве имен System.Windows.Forms. В следующем фрагменте кода показано, как объявить переменную с помощью полного имени этого класса:

Dim LBox As System.Windows.Forms.ListBox

Предотвращение конфликтов имен

Пространства имен .NET Framework разрешают проблему, иногда называемую загрязнением пространства имен (namespace pollution), состоящую в том, что у разработчика библиотеки классов возникают проблемы с использованием одинаковых имен в разных библиотеках. Такие конфликты с существующими компонентами иногда называют конфликтами имен (name collisions).

Например, если создается новый класс с именем 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, а также к другим пространствам имен, связанным с проектом.

См. также

Задачи

Практическое руководство. Создание и использование сборок с помощью командной строки (C# и Visual Basic)

Ссылки

Оператор Imports (пространство имен .NET и тип)

ListBox

System.Windows.Forms

Основные понятия

Сборки и глобальный кэш сборок (C# и Visual Basic)

Ссылки и оператор Imports (Visual Basic)