Вместо составного имени 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!