Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 97
Текст из файла (страница 97)
Сонпкпонп сб1 = пеи Соппкпонп(10)т кпс 1т с(о ( 1 = сб1. Сопок () т Сопво1е.нг1ке(1 + " ")) ) нв11е (1 > О) т Сопзо1е.Игасеьапе(); Сонпспонп сс(2 = пен Соипкпонп(20)т с(о ( сс(2.сопок () т Сопво1е.Итаке(1 т " ")) ) нв11е(). > 0)т Сопзо1е.Игасеьапе(); сб2.певек(4)т бо ( 1 = сб2.сопок(); Сопзо1е.ит1ке(1 + " "]; ) нб11е (1 > О) т Сопзо1е.иг1кеьапе(); ) В эту версию программы внесены два существенных изменения. Первое из них состоит в применении директивы пз1пст в самом нас)але программы: изапд соппсетт Благодаря этому становится видимым пространство имен соипсег. Второе изменение состоит в том, что класс СоппСОоип больше не нужно дополнительно определять с помощью пространства имен Соипсег, как демонстрирует приведенная ниже строка кода из метода Ма).п () . Соппкпоип об1 = лен Соппкпоип(10) Теперь пространство имен сопл сед становится видимым, и поэтому класс сопп СОоип может быть использован непосредственно.
Рассматриваемая здесь программа иллюстрирует еще одно важное обстоятельство: применение одного пространства имен не отменяет действие другого. Когда пространство имен делается видимым, это просто дает возможность использовать его содержимое без дополнительного определения имен. Следовательно, в данном примере оба пространства имен, я узгелт и Соппгег, становятся видимыми. 602 Часть (.
Язык С() Вторая форма директивы извод Вторая форма директивы св1ПЯ позволяет определить еще одно имя (так называемый псевдоним) типа данных или пространства имен. Эта форма приведена ниже. пв1пч псевдоним = имят где псевдоним становится еще одним именем типа (например, типа класса) или пространства имен, обозначаемого как имя. После того как псевдоним будет создан, он может быть использован вместо первоначального имени. Ниже приведен вариант программы из предыдущего примера, переработанный с целью показать создание и применение псевдонима мусоопсег вместо составного имени Соппсег.
Сосптпонп. // ПродемонСтрировать применение псевдонима. оз1пд Яувсегн // Создать псевдоним для составного имени // Соппгег.соопгоонп. озала Мусонпсег = Сонпсег.сонпспоипк // Объявить пространство имен для счетчиков. павеарасе Соппсег ( // Простой вмчитаккяий счетчик. с1авв Соипсоонп ( апг ча1т рнЬ11с Соопспоип(тпг и) ( ча1 = пт ) роьгьс чогб невес(ьпг и) ( ча1 = пт ) рнЬ11с тпс Сопок () ( 1Е(ча1 > 0) гекигп ча1--т е1ае гекнгп От ) с1ааа ИЯОевол ( асас1с чогд маьп() ( // Здесь и далее псевдоним Мусоспсег используется // вместо составного имени Соипсег.сонпкпонп.
МуСоипкег сб1 = пен Мусоипсег(10)т упс 1) бо ( ). = сб1.Соппс()т Сопво1е.игьге(1 + " ")т Глава )6. Пространства имен, препроцессор и сборки 503 ) ып11е (1 > О)," Сопяо1е.иг1ке11пе(); МуСочпсеГ сс(2 = пеы МуСоипкег(20); с(о ( 1 = сс(2.Соипс () т Сопяо1е.итаке(1 ь " ")т ) ыд11е(1 > 0) т Сопяо1е.иг1геьъпе() т со2.зевес(4)т с(о ( со2.Сочно()) Сопяо1е.итаке(1 т " "')) ) нп11е().
> О); Сопя о1е. Хгасег апе () т ) ) Псевдоним мусоппгег создается с помощью следующего оператора: ияапп МуСоипсег = Сочпкег.Соипсооыпт После того как псевдоним будет определен в качестве другого имени класса содпсег. соипспоып, его можно использовать для объявления объектов без дополнительного определения имени данного класса. Например, в следующей строке кода из рассматриваемой здесь программы создается объект класса содпг()оып: МуСоопсег сс)1 = пеы Мусочпсег(10) Аддитивный характер пространств имен Под одним именем можно объявить несколько пространств имен.
Это дает возможность распределить пространство имен по нескольким файлам или даже разделить его в пределах одного и того же файла исходного кода. Например, в приведенной ниже программе два пространства имен определяются под одним и тем же именем Соппгег. Одно из иих содержит класс Соопкпоып, а другое — класс Соппспр. Во время компиляции содержимое обоих пространств имен содпсег складывается вместе. // Аддитивный характер пространств имен. оя1пя Яуягюлт // Сделать видимым пространство имен Соипсег. ияапд Сочдгею // Это одно пространство имен Сочпкег. паюеярасе Сочпкег ( // Простой вычитаюыий счетчик. с1аяя Сочпкронп ( апк ча1) рчъ11с Соипсооып(1пс п) ( ча1 и) 504 Часть), Язык С№ риЫ№с чо1к) Ревев(1пи и) ( ча1 = пк ) риЫ№с 1пи Сосни() ( 11(ча1 > 0) кеиикп ча1 †; е1ве кекикп 0; ) ) ) // А это другое пространство имен Соипиек.
паиеврасе Соипсек ( // Простой суммируккций счетчик. с1авв Соипидр ( №пк ча1; апк какдекк риЫ1с 1пс Такдеи ( дек( кекикп какдекк ) риЫ№с Соипсдр(№пи и) ( какдек = и( ча1 = 0; ) риЫ№с чо1о Вевеи(1пс и) ( какдек - и; ча1 - 0; ) риЫ№с 1пи Соипи() ( 11(ча1 < какдеи) кеиикп ча) ~' К е1ве кеиикп Какдев) ) ) с1авв ЫЯОеио5 ( виаи1с чо1й Ма1п() ( СоипКПомп ск( = пем Соипироип(10) Соипидр си пем Соипсир(8)к апс 1; с(о ( = со.сосни() Сопво1е.икаие(1 + " "); ) ма11е(1 > 0); Сопво1е.ык1ие11пе(): Глава 16. Пространства имен, прелроцессор и сборки 505 с(о ( = со.Соопк()т Сапяо1е.Икьсе(1 + " ")т ) иЫ1е(1 < сп.такчес)т ) ) Вот к какому результату приводит выполнение этой программы: 10 9 8 7 6 5 4 3 2 1 0 012345678 Обратите также внимание иа то, что директива ияепе Сооппект делает видимым все содержимое пространства имен соппсег.
Это дает возможность обращаться к классам Соопепоип и Соопг()р непосредственно, т.е. беэ дополнительного указания пространства имен. При этом разделение пространства имен соопбег иа две части ие имеет никакого значения. Вложенные пространства имен Одно пространство имен может быть вложено в другое. В качестве примера рассмотрим следующую программу: // Вложенные пространства имен. пявпч Вуякеи; паееврасе И51 ( с1авя С1аяяА ( ров11с С1аЯЯА() ( Сопяо1е.ит1се11пе("Конструирование класса С1аяяА")т ) паиеярасе И52 ( // вложенное пространство имен с1авя С1авяВ ( рпЬ11с С1аяяВ() Сопяо1е.игеке11пе("Конструирование класса С1аяяВ") ) ) ) с1аяя Иевкесизпеео ( якапес чо16 Иа1п() ( И51.С1аявА а = пев И51.С1аявА() // И52.С1аяяВ Ь = пеи И52.С1авяВ()т // Неверно!!! // пространство И52 невидимо И51.И52.С1аяяВ Ь = пеи И51.И52.С1аяяВ()т // Верно( ) 506 Часть ).
Язык С№ Выполнение этой программы дает следующий результат: Конструирование класса С1аввА Конструирование класса С1аввз В этой программе пространство имен НЯ2 вложено в пространство имен НЯ1. Поэтому для обращения к классу С1аввВ необходимо дополнительно указать пространства имен Н51 и М52.
Указания одного лишь пространства имен М52 для этого недостаточно. Как следует из приведенного выше примера, пространства имен дополнительно указываются через точку. Следовательно, для обращения к классу с1ав вВ в методе маги ( ) необходимо указать его полное имя — НЯ1. НЯ2. С1аввВ.
Пространства имен могут быть вложенными более чем на два уровня. В этом случае член вложенного пространства имен должен быть дополнительно определен с помощью всех охватывающих пространств имен. Вложенные пространства имен можно указать в одном операторе паквеврасе, разделив их точкой. Например, вложенные пространства имен паиеврасе Онсегив ( паиеярасе 1ппегнз ) 'уу ... ) ) могут быть указаны следующим образом: паиеярасе Онсегиз.1ппегы5 ) !I ) Глобальное пространство имен Если в программе не объявлено пространство имен, то по умолчанию используется глобальное пространство имен.
Именно поэтому в примерах программ, представленных в предыдущих главах книги, не нужно было обращаться для этой цели к ключевому слову паиеврасе. Глобальное пространство удобно для коротких программ, как в примерах из этой книги, но в большинстве случаев реальный код содержится в обьявляемом пространстве имен. Главная причина инкапсуляции кода в объявляемом пространстве имен — предотвращение конфликтов имен. Пространства имен служат дополнительным средством, помогающим улучшить организацию программ и приспособить их к работе в сложной среде с современной сетевой структурой. Применение описателя псевдонима пространства имен Пространства имен помогают предотвратить конфликты имен, но не устранить их полностью. Такой конфликт может, в частности, произойти, когда одно и то же имя объявляется в двух разных пространствах имен и затем предпринимается попытка сделать видимыми оба пространства.
Допустим, что два пространства имен содержат класс мус1авв. Если попытаться сделать видимыми оба пространства имен с помощью директив пв1по, то имя МуС1авв из первого пространства вступит в конфликт с именем МуС1авв из второго пространства, обусловив появление ошибки неоднозначности. В таком случае для указания предполагаемого пространства имен явным образом можно воспользоваться описателем псевдонима пространства имен::. Глава )6.
Пространстеа имен, прелроцессор а сборки 507 Ниже приведена общая форма оператора::. псевдоним пространства имен::идентификатор где псевдоним пространства имен обозначает конкретное имя псевдонима пространства имен, а идентификатор — имя члена этого пространства. Для того чтобы стало понятнее назначение описатсля псевдонима пространства имен, рассмотрим следующий пример программы, в которой создаются два пространства имен, Соипгег и АпогпегСоипсег, и в обоих пространствах объявляется класс Соипспонп. Затем оба пространства имен становятся видимыми с помощью директив ия1пп. И наконец, в методе пайп () предпринимается попытка получить экземпляр объекта типа соипссомп.
// Продемонстрировать необходимость описателя::. // // Эта программа не подлежит компиляции. и51пя Буягещт // Использовать оба пространства имен СоипГЕГ // и АпогпегСоипсег. иягпч Соипгегт ия1пч АпоГЬегСоипсегт // Объявить пространство имен для счетчиков. пащеярасе Соипсег ( // Простой внчитающий СЧЕтчик. с1аяя Соипспонп ( гпс ча1т риЬ11с Соипгпонп(1пг и) ( иа1 = пт ) // ) ) // Обьявить еще одно пространство имен для счетчиков. пащеярасе Апогпегсоипсег ( // Объявить еще один класс Соипгпонп, принадлежащий // пространству имен АпогпегСоипгег. с1аяя СоипгОонп ( гпг иа1т ривггс СоипСРонп(апс и) ( ча1 = пт // ) ) с1аяя ИЬуА11аясиа1111ег ( ясасгс ио1б Магп() ( 1пг 1т 508 Часть ).