Страница 240 из 502
ГЛАВА 16 Пространства имен, препроцессор и сборки
В этой главе речь пойдет о трех средствах С#, позволяющих улучшить организованность и доступность программы. Этими средствами являются пространства имен, препроцессор и сборки.
Пространства имен
О пространстве имен уже вкратце упоминалось в главе 2 в связи с тем, что это основополагающее понятие для С#. В действительности пространство имен в той или иной степени используется в каждой программе на С#. Потребность в подробном рассмотрении пространств имен не возникала до сих пор потому, что для каждой программы на C# автоматически предоставляется используемое по умолчанию глобальное пространство имен. Следовательно, в примерах программ, представленных в предыдущих главах, использовалось глобальное пространство имен. Но во многих реальных программах приходится создавать собственные пространства имен или же организовать взаимодействие с другими пространствами имен. Подобные пространства будут представлены далее во всех подробностях.
Пространство имен определяет область объявлений, в которой допускается хранить одно множество имен отдельно от другого. По существу, имена, объявленные в одном пространстве имен, не будут вступать в конфликт с аналогичными именами, объявленными в другой области. Так, в библиотеке классов для среды .NET Framework, которая одновременно является библиотекой классов С#, используется пространство имен System. Именно поэтому строка кода
<b>using System;</b>
обычно вводится в самом начале любой программы на С#. Как пояснялось в главе 14, классы ввода-вывода определены в пространстве имен System.IO, подчиненном пространству имен System. Ему подчинены и многие другие пространства имен, относящиеся к разным частям библиотеки классов С#.
Пространства имен важны потому, что за последние годы в программировании "расплодились" в огромном количестве имена переменных, методов, свойств и классов, применяемых в библиотечных программах, стороннем и собственном коде. Поэтому без отдельных пространств все эти имена будут соперничать за место в глобальном пространстве имен, порождая конфликтные ситуации. Так, если в программе определен класс Finder, то этот класс может вступить в конфликт с другим классом Finder, доступным в сторонней библиотеке, используемой в этой программе. К счастью, подобного конфликта можно избежать, используя отдельные пространства имен, ограничивающие область видимости объявленных в них имен.
Пространство имен объявляется с помощью ключевого слова namespace. Ниже приведена общая форма объявления пространства имен:
<b>namespace имя {</b>
<b>// члены</b>
<b>}</b>
где имя обозначает конкретное имя объявляемого пространства имен. При объявлении пространства имен определяется область его действия. Все, что объявляется непосредственно в этом пространстве, оказывается в пределах его области действия. В пространстве имен можно объявить классы, структуры, делегаты, перечисления, интерфейсы или другие пространства имен.
Ниже приведен пример объявления namespace для создания пространства имен Counter. В этом пространстве локализуется имя, используемое для реализации простого класса вычитающего счетчика CountDown.
<b>// Объявить пространство имен для счетчиков.</b>
<b>namespace Counter {</b>
<b> // Простой вычитающий счетчик, </b>
<b> class CountDown {</b>
<b> int val;</b>
<b> public CountDown(int n) {</b>
<b> val = n;</b>
<b> }</b>
<b> public void Reset(int n) {</b>
<b> val = n;</b>
<b> }</b>
<b> public int Count() {</b>
<b> if(val > 0) return val--;</b>
<b> else return 0;</b>
<b> }</b>
<b> }</b>
<b>} // Это конец пространства имен Counter.</b>
Обратите внимание на то, что класс CountDown объявляется в пределах области действия пространства имен Counter. Для того чтобы проработать этот пример на практике, поместите приведенный выше код в файл Counter.cs.
Ниже приведен пример программы, демонстрирующий применение пространства имен Counter.
<b>// Продемонстрировать применение пространства имен Counter.</b>
<b>using System;</b>
<b>class NSDemo {</b>
<b> static void Main() {</b>
<b> // Обратите внимание на то, как класс CountDown </b>
<b> // определяется с помощью пространства имен Counter.</b>
<b> Counter.CountDown cd1 = new Counter.CountDown(10);</b>
<b> int i;</b>
<b> do {</b>
<b> i = cd1.Count();</b>
<b> Console.Write(i + " ");</b>
<b> } while (i > 0);</b>
<b> Console.WriteLine();</b>
<b> // Еще раз обратите внимание на то, как класс CountDown </b>
<b> // определяется с помощью пространства имен Counter.</b>
<b> Counter.CountDown cd2 = new Counter.CountDown(20);</b>
<b> do {</b>
<b> i = cd2.Count();</b>
<b> Console.Write(i + " ");</b>
<b> } while (i > 0);</b>