Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 96
Текст из файла (страница 96)
Ниже приведен пример объявления паюеврасе для создания пространства имен соцпьег. В этом пространстве локализуется имя, используемое для реализации простого класса вычитающего счетчика СоцпЬРоип. // Объявить пространство имен лля счетчиков. паюеврасе Соцпсег ( // Простой вычитающий счетчик. с1ава Соцпгпоип ( гпп ча1/ рцЬ11с Соцпвоонп(ъпс и) ( ча1 = п; рцЬ1»с чоъд невес(1пе и) ( ча1 = и; ) рцЬ1»с ьпе Соцпв () ( 11(ча1 > О) гегцгп ча1--; е1ве гетцгп 0; ) ) ) О Это конец пространства имен Соцпвег. Обратите внимание на то, что класс соцпьпонп объявляется в пределах области действия пространства имен соцпьег.
Для того чтобы проработать этот пример на практике, поместите приведенный выше код в файл Соцпсег. сэ. Глава (6. Пространства имен, препроцессор и сборки 497 Ниже приведен пример программы, демонстрирующий применение пространства имен соппсег. // Продемонстрировать применение пространства // имен Соопгег. озкпч Яузгепи с1азз НЯОещо ( зсасгс ного Магд() ( // Обратите внимание на то, как класс Соопсоонп // определяется с помощью пространства имен соппгег. Соппгег.Соппкооип сб1 = пен Соопсег.Соппкпонп(10)7 тпк 17 бо ( 1 = сб1.Соппс()) Сопво1е.нг1ге (1 т " ") 7 ) ии11е (1 > О) ) Сопзо1е.игтсет вне() ) // Еще раз обратите внимание на то, как класс Сооптроип // определяется с помощью пространства имен Соппсег.
Соппсег.соопгооип сб2 = пен Соппсег.Соппсооип(20)7 бо ( = со2.Соопг()7 Сопзо1е.иггге(). + " "); ) ин11е(1 > 0); Сопзо1е.игггеьапе()7 сб2.певек(4)) бо ( 1 = сб2.соопг () ) Сопзо1е.нггсе(1 + " ")т ) ни11е(). > 0)7 Сопзо1е.игагеьгпе()7 ) ) При выполнении этой программы получается следующий результат: 10 9 8 7 б 5 4 3 2 1 0 20 19 18 17 16 15 14 13 12 11 10 9 8 7 б 5 4 3 2 1 0 43210 Для того чтобы скомпилировать зту программу, вы должны включить приведенный выше код в отдельный файл и указать его вместе с упоминавшимся выше файлом, содержащим код объявления пространства имен соппсег. Если этот код находится в файле МЯОещо. си, а код объявления пространства имен сопл се г — в файле сопл сег .
сз, то для компиляции программы используется следующая командная строка: свс Нзпевко. св соспсег. св 498 часть (. язык Сз Некоторые важные аспекты данной программы заслуживают более пристального внимания. Во-первых, при создании объекта класса соипгРонп необходимо дополнительно определить его имя с помощью пространства имен соипсег, как показано ниже.
Ведь класс соипгпоип объявлен в пространстве имен соипсег. Соиигег.Соипгооии ск(1 = иеи Соипгег.Соипгпоип(10) Это правило можно обобщить: всякий раз, когда используется член пространства имен, его имя необходимо дополнительно определить с помощью этого пространства имен. В противном случае член пространства имен ие будет обнаружен компилятором.
Во-вторых, как только объект типа соипсег будет создан, дополнительно определять его члены с помощью пространства имен уже ие придется. Следовательно, метод сб1. соиле () может быть вызван непосредственно без дополнительного указания простраиства имен, как в приведенной ниже строке кода. 1 сб1.Соипг(); И в-третьих, ради наглядности примера рассматриваемая здесь программа была разделена иа два отдельных файла.
В одном файле содержится код объявления простраиства имен Соипгег, а в другом — код самой программы ньРеюо. Но оба фрагмента кода можно было бы объединить в единый файл. Более того, в одном файле исходного кода может содержаться два или более пространства имен со своими собственными областями объявлений. Когда оканчивается действие внутреннего пространства имен, возобиовляется действие внешнего пространства имен — в примере с соипсег это глобальное пространство имен. Ради большей ясности в последующих примерах все пространства имен, требующиеся в программе, будут представлены в одном и том же файле.
Однако следует иметь в виду, что их допускается распределять по отдельным файлам, что чаще практикуется в выходном коде. Предотвращение конфликтов имен с помощью пространств имен Главное преимущество пространств имен заключается в том, что объявленные в иих имена ие вступают в конфликт с именами, объявленными за их пределами. Например, в приведенной ниже программе определяются два пространства имен. Первым из иих является представленное ранее пространство имен соипгег, а вторым — соипсег2.
Оба пространства имен содержат классы с одинаковым именем СоипСРоип, ио поскольку это разные пространства, то оба класса СоипГРоип ие вступают в конфликт друг с другом. Кроме того, оба пространства имен определены в одном и том же файле. Как пояснялось выше, это вполне допустимо. Безусловно, каждое из этих пространств имен можно было бы выделить в отдельный файл, если бы в этом возникла потребность. // Пространства имен прелотвраыают конфликты имен. ив1пд Зувсепц // Объявить пространство имен Соипгег.
иавеврасе Соиисег ( // Простой вычитающий счетчик. с1авв Соипгоомп ( ьпс ча1т Глава )6. Пространства имен, препроцессор и сборки 499 рпЫ1с Соипкпоип(апс и) ( ча1 = и) ) рпЬ11с чогб Певек (апк и) ( ча1 = пт рпЫас апс Сопок() ( 16(ча1 > 0) геспгп ча1--; е1яе гегпгп Ог ) ) // Объявить пространство имен Соппсег2. паэеярасе Соопсег2 ( /* Этот класс Соппкпонп относится к пространству имен Соппсег2 и поэтому не вступает в конФликт с аналогичным классом иэ пространства имен Соппкег.
*/ с1аяя Соппспоып ( рпЫас чоаб Сопок() ( сопяо1е.игагеьапе("это метод соиле() иэ " + "пространства имен Соппсег2.")т ) ) ) с1аяя Нзпеэо2 ( вкасас чо10 Маап() ( // Это класс Соипспонп иэ пространства имен Соипкег. Соипкег.соппкпонп сб1 = пен Соппсег.Соппспонп(10)т // Это класс Соппспонп иэ пространства имен Соппсег2. Соппкег2.Соппспонп сб2 = пеы Соппсег2.Соппкпоип()т апг 17 с(о ( = сб1.Сопле()т Сопяо1е.
Иг).се (1 ь " ") ) ) иЫ1е(). > 0) г Сопяо1е.иггсепгпе()т сс(2.Сопле()т ) ) Вот к какому результату приводит выполнение втой программы: 10 9 8 7 6 5 4 3 2 1 0 Это метод Сопок() иэ пространства имен Соппсег2. 500 Часть!. Язык С№ Как следует из приведенного выше результата, класс соппсРоип из пространства имен Соппсег существует отдельно от класса того же названия из пространства имен соппсег2, и поэтому конфликт имен не возникает. Несмотря на всю простоту данного примера, он наглядно показывает, как удается избежать конфликта имен в собственном коде и коде, написанном другими, поместив классы с одинаковыми именами в разные пространства имен.
Директива ив~ад Если в программе присутствуют частые ссылки на члены конкретного пространства имен, то указывать это пространство всякий раз, когда требуется ссылка на него, не очень удобно. Преодолеть это затруднение помогает директива пз1ПЯ. В подавляющем большинстве приводившихся ранее примеров программ с помощью этой директивы делалось видимым глобальное для С№ пространство имен зузсещ, поэтому она отчасти вам уже знакома. Как и следовало ожидать, с помощью директивы пз1ПЯ можно сделать видимыми вновь создаваемые пространства имен. Существуют две формы директивы пз1ПЯ.
Ниже приведена первая из них. пяьпд имят где имя обозначает имя того пространства имен, к которому требуется получить доступ. Все члены, определенные в указанном пространстве имен, становятся видимыми и поэтому могут быть использованы без дополнительного определения их имен. Директиву пз1пд необходимо вводить в самом начале каждого файла исходного кода перед любыми другими объявлениями или же в начале тела пространства имен. Приведенная ниже программа является вариантом предыдущего примера, переработанным с целью продемонстрировать применение директивы пзъпЯ, делающей видимым создаваемое пространство имен.
// Продемонстрировать применение директивы оаьпЧ. ов1по Зувкещ; // Сделать видимым пространство имен Соппсек. оз1пд Соопьект // Объявить пространство имен для счетчиков. , пащеврасе Соппсек ( // Простой вычитающий счетчик. с1азя Соопкоомп ( апс ча1т рпю11с Соопопонп(впс и) ( ча1 = пт ) роо11с чо1б певек(1пк и) ( ча1 = пт роп11с 1по Сонно() ( 11(ча1 > 0) кеспкп ча1--т е1ае кеоокп От Глава )б. Пространства имен, препроцвссор и сборки 50"т ) ) с1авз Изпеиоз ( вкакас то1б Ма).п() ( // теперь класс соппспонп может быть использован непосредственно.