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

Страница 241 из 502

<b>    Console.WriteLine();</b>

<b>    cd2.Reset(4);</b>

<b>    do {</b>

<b>      i = cd2.Count();</b>

<b>      Console.Write(i + &quot; &quot;);</b>

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

<b>    Console.WriteLine() ;</b>

<b>  }</b>

<b>}</b>

При выполнении этой программы получается следующий результат.

<b>10 9 8 7 6 5 4 3 2 1 0</b>

<b>20 19 18 17 16 15 14 13 12 11 10 9 8 7 б 5 4 3 2 1 0 4 3 2 1 0</b>

<b>4 3 2 1 0</b>

Для того чтобы скомпилировать эту программу, вы должны включить приведенный выше код в отдельный файл и указать его вместе с упоминавшимся выше файлом, содержащим код объявления пространства имен Counter. Если этот код находится в файле NSDemo.cs, а код объявления пространства имен Counter — в файле Counter.cs, то для компиляции программы используется следующая командная строка.

<b>csc NSDemo.cs counter.cs</b>

Некоторые важные аспекты данной программы заслуживают более пристального внимания. Во-первых, при создании объекта класса CountDown необходимо дополнительно определить его имя с помощью пространства имен Counter, как показано ниже. Ведь класс CountDown объявлен в пространстве имен Counter.

<b>Counter.CountDown cd1 = new Counter.CountDown(10);</b>

Это правило можно обобщить: всякий раз, когда используется член пространства имен, его имя необходимо дополнительно определить с помощью этого пространства имен. В противном случае член пространства имен не будет обнаружен компилятором.

Во-вторых, как только объект типа Counter будет создан, дополнительно определять его члены с помощью пространства имен уже не придется. Следовательно, метод cd1.Count() может быть вызван непосредственно без дополнительного указания пространства имен, как в приведенной ниже строке кода.

<b>i = cd1.Count();</b>

И в-третьих, ради наглядности примера рассматриваемая здесь программа была разделена на два отдельных файла. В одном файле содержится код объявления пространства имен Counter, а в другом — код самой программы NSDemo. Но оба фрагмента кода можно было бы объединить в единый файл. Более того, в одном файле исходного кода может содержаться два или более пространства имен со своими собственными областями объявлений. Когда оканчивается действие внутреннего пространства имен, возобновляется действие внешнего пространства имен — в примере с Counter это глобальное пространство имен. Ради большей ясности в последующих примерах все пространства имен, требующиеся в программе, будут представлены в одном и том же файле. Следует, однако, иметь в виду, что их допускается распределять по отдельным файлам, что практикуется чаще в выходном коде.

Главное преимущество пространств имен заключается в том, что объявленные в них имена не вступают в конфликт с именами, объявленными за их пределами. Например, в приведенной ниже программе определяются два пространства имен. Первым из них является представленное ранее пространство имен Counter, а вторым — Counter2. Оба пространства имен содержат классы с одинаковым именем CountDown, но поскольку это разные пространства, то оба класса CountDown не вступают в конфликт друг с другом. Кроме того, оба пространства имен определены в одном и том же файле. Как пояснялось выше, это вполне допустимо. Безусловно, каждое из этих пространств имен можно было бы выделить в отдельный файл, если бы в этом возникла потребность.

<b>// Пространства имен предотвращают конфликты имен.</b>

<b>using System;</b>

<b>// Объявить пространство имен Counter, </b>

<b>namespace Counter {</b>

<b>// Простой вычитающий счетчик, </b>

<b>  class CountDown { 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>}</b>

<b>// Объявить пространство имен Counter2.</b>

<b>namespace Counter2 {</b>

<b>/* Этот класс CountDown относится к пространству имен Counter2 и поэтому не вступает в конфликт с аналогичным классом из пространства имен Counter.</b><b>*/</b>

<b>  class CountDown {</b>

<b>    public void Count() {</b>

<b>      Console.WriteLine(&quot;Это метод Count() из &quot; +</b>

<b>             &quot;пространства имен Counter2.&quot;);</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

<b>class NSDemo2 {</b>