Ниже приведен пример программы, демонстрирующий применение пространства имен Counter.

// Продемонстрировать применение пространства имен Counter.

Using System;

class NSDemo {

static void Main() {

// Обратите внимание на то, как класс CountDown // определяется с помощью пространства имен Counter.

Counter.CountDown cdl = new Counter.CountDown(10); int i;

do {

i = cdl.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine ();

// Еще раз обратите внимание на то, как класс CountDown // определяется с помощью пространства имен Counter.

Counter.CountDown cd2 = new Counter.CountDown(20);

do {

i = cd2.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine ();

cd2.Reset (4) ; do {

i = cd2.Count ();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine () ;

}

}

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

10 9 876543210

Б 5 4 3 2 1 0 4 3 2 1 0

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

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

Csc NSDemo.cs counter.cs

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

Counter.CountDown cdl = new Counter.CountDown(10);

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

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

i = cdl.Count();

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

Предотвращение конфликтов имен с помощью пространств имен

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

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

// Объявить пространство имен Counter, namespace Counter {

// Простой вычитающий счетчик, class CountDown { int val; -

public CountDown(int n) { val = n;

}

public void Reset(int n) { val = n;

}

public int Count () {

if(val > 0) return val—; else return 0;

}

}

}

// Объявить пространство имен Counter2. namespace Counter2 {

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

*/

class CountDown {

public void Count() {

Console.WriteLine("Это метод Count() из " +

"пространства имен Counter2.");

}

}

}

class NSDemo2 {

static void Main() {

// Это класс CountDown из пространства имен Counter. Counter.CountDown cdl = new Counter.CountDown(10);

// Это класс CountDown из пространства имен Counter2. Counter2.CountDown cd2 = new Counter2.CountDown(); int i;

do {

i = cdl.Count();

Console.Write(i + " ");

} while(i > 0);

Console.WriteLine();

Наши рекомендации