Чтение онлайн

на главную - закладки

Жанры

Полное руководство. С# 4.0
Шрифт:

Главное преимущество пространств имен заключается в том, что объявленные в них имена не вступают в конфликт с именами, объявленными за их пределами. Например, в приведенной ниже программе определяются два пространства имен. Первым из них является представленное ранее пространство имен Counter, а вторым — Counter2. Оба пространства имен содержат классы с одинаковым именем CountDown, но по скольку это разные пространства, то оба класса CountDown не вступают в конфликт друг с другом. Кроме того, оба пространства имен определены в одном и том же фай ле. Как пояснялось выше, это вполне допустимо. Безусловно, каждое из этих про странств имен можно было бы выделить в отдельный файл, если бы в этом возникла потребность. // Пространства имен предотвращают конфликты имен. using System; // Объявить пространство имен 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 cd1 = new Counter.CountDown(10); // Это класс CountDown из пространства имен Counter2. Counter2.CountDown cd2 = new Counter2.CountDown; int i; do { i = cd1.Count; Console.Write(i + " "); } while(i > 0); Console.WriteLine; cd2.Count; } }

Вот к какому результату приводит выполнение этой программы. 10 9 8 7 6 5 4 3 2 1 0 Это метод Count из пространства имен Counter2.

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

Если в программе присутствуют частые ссылки на члены конкретного пространства имен, то указывать это пространство всякий раз, когда требуется ссылка на него, не очень удобно. Преодолеть это затруднение помогает директива using. В подавляю щем большинстве приводившихся ранее примеров программ с помощью этой ди рективы делалось видимым глобальное для C# пространство имен System, поэтому она отчасти вам уже знакома. Как и следовало ожидать, с помощью директивы using можно сделать видимыми вновь создаваемые пространства имен.

Существуют две формы директивы using. Ниже приведена первая из них: using имя;

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

Приведенная ниже программа является вариантом предыдущего примера, пере работанным с целью продемонстрировать применение директивы using, делающей видимым создаваемое пространство имен. // Продемонстрировать применение директивы using. using System; // Сделать видимым пространство имен Counter. using 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; } } } class NSDemo3 { static void Main { // Теперь класс CountDown может быть использован непосредственно. CountDown cd1 = new CountDown(10); int i; do { i = cd1.Count; Console.Write(i + " "); } while(i > 0); Console.WriteLine; CountDown cd2 = new 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; } }

В эту версию программы внесены два существенных изменения. Первое из них состоит в применении директивы using в самом начале программы, как показано ниже. using Counter;

Благодаря этому становится видимым пространство имен Counter. Второе измене ние состоит в том, что класс CountDown больше не нужно дополнительно определять с помощью пространства имен Counter, как демонстрирует приведенная ниже строка кода из метода Main. CountDown cd1 = new CountDown(10);

Теперь пространство имен Counter

становится видимым, и поэтому класс CountDown может быть использован непосредственно.

Рассматриваемая здесь программа иллюстрирует еще одно важное обстоятельство: применение одного пространства имен не отменяет действие другого. Когда простран ство имен делается видимым, это просто дает возможность использовать его содержи мое без дополнительного определения имен. Следовательно, в данном примере оба пространства имен, System и Counter, становятся видимыми. Вторая форма директивы using

Вторая форма директивы using позволяет определить еще одно имя (так называе мый псевдоним) типа данных или пространства имен. Эта форма приведена ниже: using псевдоним = имя;

где псевдоним становится еще одним именем типа (например, типа класса) или про странства имен, обозначаемого как имя. После того как псевдоним будет создан, он может быть использован вместо первоначального имени.

Ниже приведен вариант программы из предыдущего примера, измененный с це лью показать создание и применение псевдонима MyCounter вместо составного имени Counter.CountDown. // Продемонстрировать применение псевдонима. using System; // Создать псевдоним для составного имени Counter.CountDown. using MyCounter = Counter.CountDown; // Объявить пространство имен для счетчиков. 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; } } } class NSDemo4 { static void Main { // Здесь и далее псевдоним MyCounter используется // вместо составного имени 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); Аддитивный характер пространств имен

Под одним именем можно объявить несколько пространств имен. Это дает воз можность распределить пространство имен по нескольким файлам или даже разде лить его в пределах одного и того же файла исходного кода. Например, в приведенной ниже программе два пространства имен определяются под одним и тем же именем 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; va1 = 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(d < 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 на две части не имеет никакого значения. Вложенные пространства имен

Поделиться:
Популярные книги

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Попаданка

Ахминеева Нина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Жена проклятого некроманта

Рахманова Диана
Фантастика:
фэнтези
6.60
рейтинг книги
Жена проклятого некроманта

Камень. Книга шестая

Минин Станислав
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Камень. Книга шестая

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

Испытание Огня

Гаврилова Анна Сергеевна
3. Академия Стихий
Фантастика:
фэнтези
9.43
рейтинг книги
Испытание Огня

Идеальный мир для Лекаря 25

Сапфир Олег
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 25

Ведьмак. Перекресток воронов

Сапковский Анджей
Фантастика:
фэнтези
5.00
рейтинг книги
Ведьмак. Перекресток воронов

Сердце Дракона. Том 20. Часть 1

Клеванский Кирилл Сергеевич
20. Сердце дракона
Фантастика:
фэнтези
боевая фантастика
городское фэнтези
5.00
рейтинг книги
Сердце Дракона. Том 20. Часть 1

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я