Вместо составного имени Counter.CountDown.
MyCounter cd1 = new MyCounter(10);
int i;
do {
i = cd1.Count() ;
Console.Write(i + " ");
} while (i > 0);
Console.WriteLine() ;
MyCounter cd2 = new MyCounter(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();
}
}
Псевдоним MyCounter создается с помощью следующего оператора.
using MyCounter = Counter.CountDown;
После того как псевдоним будет определен в качестве другого имени класса Counter.CountDown, его можно использовать для объявления объектов без дополнительного определения имени данного класса. Например, в следующей строке кода из рассматриваемой здесь программы создается объект класса CountDown.
MyCounter cd1 = new MyCounter (10);
Аддитивный характер пространств имен
П04 одним именем можно объявить несколько пространств имен. Это дает возможность распределить пространство имен по нескольким файлам или даже разделить его в пределах одного и того же файла исходного кода. Например, в приведенной ниже программе два пространства имен определяются под одним и тем же именем Counter. Одно из них содержит класс CountDown, а другое — класс CountUp. Во время компиляции содержимое обоих пространств имен Counter складывается.
// Аддитивный характер пространств имен,
using System;
// Сделать видимым пространство имен Counter,
using Counter;
// Это одно пространство имен 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;
}
}
}
//А это другое пространство имен 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. Глобальное пространство удобно для коротких программ, как в примерах из этой книги, но в большинстве случаев реальный код содержится в объявляемом пространстве имен. Главная причина инкапсуляции кода в объявляемом пространстве имен — предотвращение конфликтов имен. Пространства имен служат дополнительным средством, помогающим улучшить организацию программ и приспособить их к работе в сложной среде с современной сетевой структурой.
Применение описателя псевдонима пространства имен ::
Пространства имен помогают предотвратить конфликты имен, но не устранить их полностью. Такой конфликт может, в частности, произойти, когда одно и то же имя объявляется в двух разных пространствах имен и затем предпринимается попытка сделать видимыми оба пространства. Допустим, что два пространства имен содержат класс MyClass. Если попытаться сделать видимыми оба пространства имен с помощью директив using, то имя MyClass из первого пространства вступит в конфликт с именем MyClass из второго пространства, обусловив появление ошибки неоднозначности. В таком случае для указания предполагаемого пространства имен явным образом можно воспользоваться описателем псевдонима пространства имен :: .
|
|
Ниже приведена общая форма оператора ::.
Дата добавления: 2019-02-12; просмотров: 273; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!