public void Reset(int n) {
val = n;
}
public int Count() {
if(val > 0) return val--;
else return 0;
}
}
}
//А это другое пространство имен Counter,
namespace Counter {
// Простой суммирующий счетчик,
class CountUp {
int val;
int target;
public int Target {
get{
return target;
}
}
public CountUp(int n) {
target = n;
val = 0;
}
public void Reset(int n) {
target = n; val = 0;
}
public int Count() {
if(val < target) return val++;
else return target;
}
}
}
class NSDemo5 {
static void Main() {
CountDown cd = new CountDown(10);
CountUp cu = new CountUp(8);
int i;
do {
i = cd.Count();
Console.Write (i + " ");
} while (i > 0) ;
Console.WriteLine();
do {
i = cu.Count();
Console.Write(i + " ");
} while(i < cu.Target);
}
}
Вот к какому результату приводит выполнение этой программы.
10 9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8
Обратите также внимание на то, что директива
using Counter;
делает видимым все содержимое пространства имен Counter
. Это дает возможность обращаться к классам CountDown
и CountUp
непосредственно, т.е. без дополнительного указания пространства имен. При этом разделение пространства имен Counter
на две части не имеет никакого значения.
Одно пространство имен может быть вложено в другое. В качестве примера рассмотрим следующую программу.
// Вложенные пространства имен.
using System;
namespace NS1 {
class ClassA {
public ClassA() {
Console.WriteLine("Конструирование класса ClassA");
}
}
namespace NS2 {
// вложенное пространство имен
class ClassB {
public ClassB() {
Console.WriteLine("Конструирование класса ClassB");
}
}
}
}
class NestedNSDemo {
static void Main() {
NS1.ClassA a = new NS1.ClassA();
// NS2.ClassB
b = new NS2.ClassB(); // Неверно!!! Пространство NS2 невидимо
NS1.NS2.ClassB b = new NS1.NS2.ClassB(); // Верно!
}
}
Выполнение этой программы дает следующий результат.
Конструирование класса ClassA
Конструирование класса ClassB
В этой программе пространство имен NS2 вложено в пространство имен NS1. Поэтому для обращения к классу ClassB
необходимо дополнительно указать пространства имен NS1 и NS2. Указания одного лишь пространства имен NS2 для этого недостаточно. Как следует из приведенного выше примера, пространства имен дополнительно указываются через точку. Следовательно, для обращения к классу ClassB
в методе Main()
необходимо указать его полное имя — NSl.NS2.ClassB
.
Пространства имен могут быть вложенными больше, чем на два уровня. В этом случае член вложенного пространства имен должен быть дополнительно определен с помощью всех охватывающих пространств имен.
Вложенные пространства имен можно указать в одном операторе namespace
, разделив их точкой. Например, вложенные пространства имен
namespace OuterNS { namespace InnerNS {
// ...
}
}
могут быть указаны следующим образом.
namespace OuterNS.InnerNS {
// ...
}
Если в программе не объявлено пространство имен, то по умолчанию используется глобальное пространство имен. Именно поэтому в примерах программ, представленных в предыдущих главах книги, не нужно было обращаться для этой цели к ключевому слову namespace
. Глобальное пространство удобно для коротких программ, как в примерах из этой книги, но в большинстве случаев реальный код содержится в объявляемом пространстве имен. Главная причина инкапсуляции кода в объявляемом пространстве имен — предотвращение конфликтов имен. Пространства имен служат дополнительным средством, помогающим улучшить организацию программ и приспособить их к работе в сложной среде с современной сетевой структурой.