ПОНЯТНО О Visual Basic NET (том 3)

       

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


Начнем с самых крупных единиц кода – с пространств имен. До сих пор пространства имен были для нас вместилищем классов из библиотеки классов .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.


Содержание раздела