Добавить в цитаты Настройки чтения

Страница 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 &gt; 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 + &quot; &quot;);</b>

<b>    } while (i &gt; 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 + &quot; &quot;);</b>

<b>    } while (i &gt; 0);</b>