Пространства имен
Начнем с самых крупных единиц кода – с пространств имен. До сих пор пространства имен были для нас вместилищем классов из библиотеки классов .NET Framework и не имели никакого отношения к коду и структуре нашего проекта. Правда, заглядывая в Object Browser, мы привыкли видеть там сборку нашего проекта и в ней – пространство имен нашего проекта. Для чего они нужны, было непонятно. Вникнем.
Оказывается, мы можем разделить проект на несколько
пространств имен. Сначала рассмотрим, как это сделать, а потом – зачем.
Создайте проект библиотеки классов, как мы это делали в 25.2Назовите его Сборка. Введите в окно кода такой код:
Public Class КлассНоль
Public Shared Sub ПроцНоль()
MsgBox("Сработала процедура Ноль класса Ноль из пространства имен Сборка ")
End Sub
End Class
Namespace Пространство1
Public Class Класс1
Public Shared Sub Проц1()
MsgBox("Сработала процедура 1 класса 1 из 1 пространства имен ")
End Sub
End Class
Public Module Модуль1
Public Sub Проц2()
MsgBox("Сработала процедура 2 модуля 1 из 1 пространства имен ")
End Sub
End Module
End Namespace
Namespace Пространство2
Public Class Класс1
Public Shared Sub Проц1()
MsgBox("Сработала процедура 1 класса 1 из 2 пространства имен ")
End Sub
End Class
Public Module Модуль2
Public Sub Проц2()
MsgBox("Сработала процедура 2 модуля 2 из 2 пространства имен ")
End Sub
End Module
End Namespace
Откомпилируйте его.
Создайте обычный проект приложения Windows. Назовите его Проект. Сделайте в нем ссылку на библиотеку классов Сборка.dll. Поместите на форму кнопку. Введите в окно кода формы такой код:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows Form Designer generated code
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Сборка.КлассНоль.ПроцНоль()
Сборка.Пространство1.Класс1.Проц1()
Сборка.Пространство1.Модуль1.Проц2()
Сборка.Пространство2.Класс1.Проц1()
Сборка.Пространство2.Проц2()
Пространство3.Класс3.Проц3()
Проект.Пространство3.Класс3.Проц3()
End Sub
End Class
Namespace Пространство3
Public Class Класс3
Public Shared Sub Проц3()
MsgBox("Сработала процедура 3 класса 3 из 3 пространства имен ")
End Sub
End Class
Public Module Модуль1
Public Sub Проц2()
MsgBox("Сработала процедура 2 модуля 1 из 3 пространства имен ")
End Sub
End Module
End Namespace
Загляните в Object Browser. Вы видите в нем несколько сборок библиотеки классов .NET Framework и две сборки наших проектов: Проект и Сборка. Разверните в нем Проект и Сборку, как показано на Рис. 27.1.
Рис. 27.1
Пояснения: В Object Browser вы видите, что каждый наш проект представляет собой одновременно и пространство имен. У нас это пространства имен {}Проект и {}Сборка. В этом есть логика. Действительно, в Object Browser представлены пространства имен, чьи классы, модули и другие компоненты мы можем с пользой для дела использовать в проекте. Все полезное находится в пространствах имен. Какая разница, откуда это полезное взято: из библиотеки классов .NET Framework или из наших проектов Проект и Сборка? А раз так, пусть наши проекты тоже будут пространствами имен, которые соседствуют в Object Browser со стандартными пространствами имен библиотеки классов .NET Framework.
Пространства имен Проект и Сборка порождаются автоматически, без нашего участия. Теперь посмотрим на пространства имен, входящие в упомянутые два пространства. На рисунке мы видим, что внутрь пространства имен Проект входят класс Form1 и пространство имен Пространство3 со своими классом и модулем, а внутрь пространства имен Сборка входят класс КлассНоль и два пространства имен: Пространство1 и Пространство2, каждое со своим классом и модулем.
Эти три пространства имен порождены потому, что мы написали соответствующий код в окнах кода. Взглянув на него, легко видеть, что для того, чтобы породить пространство имен, достаточно в окне кода написать пару строк:
Namespace …………
End Namespace
Теперь, если между этими строками мы напишем классы, модули и другие компоненты, то они будут нормально существовать, но при этом уже не просто сами по себе, а как принадлежащие пространству имен.
Класс КлассНоль записан вне созданных нами пространств имен, но он все равно входит в пространство имен Сборка, так как все, что написано в окнах кода какого-нибудь проекта, автоматически входит в пространство имен этого проекта. Аналогично класс Form1 входит в пространство имен Проект.
Чтобы получить пространства имен В и С, входящие внутрь пространства имен А, запишите так:
Namespace А
Namespace В
End Namespace
Namespace С
End Namespace
End Namespace
Смысл пространств имен. Среди огромного количества классов, модулей и других компонентов библиотеки классов .NET Framework наверняка есть «тезки». Чтобы их не перепутать, «тезок» «рассовали» по разным пространствам имен. Вот половина ответа.
Вот другая половина. Предположим, вы создаете проект библиотеки из нескольких десятков классов, в которой встречаются классы, посвященные музыке, и классы, посвященные графике. У вас может встретиться класс TransFormat, посвященный преобразованию формата звуковых файлов, и класс с тем же именем TransFormat, посвященный преобразованию формата графических файлов. Но тезки в пределах одного пространства имен недопустимы, поэтому вам придется один из этих классов переименовывать, чего вам делать не хочется. Удобная и изящная альтернатива: организовать пространство имен Music и пространство имен Графика, а затем «распихать» классы между этими пространствами.
Обратите внимание, что и в нашем примере в пространствах имен 1 и 2 есть одноименные классы, которые без них конфликтовали бы. А вот организовывать пространство имен 3, оказывается, не было никакой нужды, так как его модуль 1 все равно находился бы в другом пространстве имен, чем его тезка из пространства имен 1.