Г. Шилдт - Полный справочник по C# (1160789), страница 80
Текст из файла (страница 80)
Например, если в программе определяетсякласс Finder, это имя обязательно будет конфликтовать с именем другого класса,Finder из библиотеки стороннего приложения, которое использует ваша программа.К счастью, благодаря пространствам имен, проблем такого рода можно избежать, поскольку пространство имен локализует видимость имен, объявленных внутри него.Объявление пространства именПространство имен объявляется с помощью ключевого слова namespace.
Общаяформа объявления пространства имен имеет следующий вид:namespace имя {// Члены}Здесь элемент имя означает имя пространства имен. Все, что определено внутрипространства имен, находится в пределах его области видимости. Следовательно, пространство имен определяет область видимости. Внутри пространства имен можнообъявлять классы, структуры, делегаты, перечисления, интерфейсы или другое пространство имен.432Часть I.
Язык С#Рассмотрим пример использования ключевого слова namespace, которое создаетпространство имен Counter. Оно ограничивает распространение имени, используемого для реализации класса обратного счета, именуемого Count Down.// Объявление пространства имен для счетчиков.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;)Здесь класс CountDown объявляется внутри области видимости, определенной пространством имен Counter.А теперь рассмотрим программу, которая демонстрирует использование пространства имен Counter.// Демонстрация использования пространства имен.using System;// Объявляем пространство имен для счетчиков,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 v a l — ;else return 0;c l a s s NSDemo {p u b l i c s t a t i c void Main() {Counter.CountDown cdl = new Counter.CountDown(10);int i;do {Глава 16.
Пространства имен, препроцессор и компоновочные файлы433i = cdl.count();Console.Write(i + " " ) ;} while(i > 0 ) ;Console.WriteLine();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();Вот результаты выполнения этой программы:1 10 9 8 7 6 5 4 3 2 1 01 20 19 18 17 16 15 14 13 12 11 10 9 8 7 б 5 4 3 2 1 01 4 3 2 1 0Здесь имеет смысл обратить ваше внимание вот на что. Во-первых, посколькукласс CountDown объявляется внутри пространства имен Counter, то при созданииобъекта класса CountDown, как показано в следующей инструкции, имя класса необходимо указывать вместе с именем пространства имен Counter.1 Counter.CountDown c d l = new Counter.CountDown(10);Но если объект Counter уже создан, то в дальнейшем называть его (или любой изего членов) полностью (по "имени-отчеству") необязательно.
Таким образом, методc d l . count () можно вызывать без указания имени пространства имен, как показано вэтой строке кода:I i = cdl.count();Пространства имен предотвращают конфликты по совпадению именОсновное преимущество использования пространств имен состоит в том, что имена, объявленные внутри одного из них, не конфликтуют с такими же именами, объявленными вне его. Например, в следующей программе создается еще один классjCountDown, но он находится в пространстве имен Counter2.// Пространства имен предотвращают конфликты,// связанные с совпадением имен.using System;// Объявляем пространство имен для счетчиков,namespace Counter {// Простой счетчик для счета в обратном направлении.class CountDown {int val;public CountDown(int n) {val = n;434Часть I. Язык С#public void reset(int n) {val = n;public int count() {if(val > 0) return v a l — ;else return 0;// Объявляем еще одно пространство имен,namespace Counter2 {/* Этот класс CountDown находится в пространствеимен Counter2 и не будет конфликтовать с одноименнымклассом, определенным в пространстве имен Counter.
*/class CountDown {public void count() {Console.WriteLine("Этот метод count() находится в" +" пространстве имен Counter2.");class NSDemo {public 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();cd2.count();1Результаты выполнения этой программы имеют такой вид:10 9 8 7 6 5 4 3 2 1 0Этот метод count() находится в пространстве имен Counter2.Как подтверждают результаты выполнения этой программы, класс CountDownвнутри пространства имен Counter отделен от класса CountDown, определенного впространстве имен Counter2, и поэтому имена не конфликтуют.
Хотя этот примерочень простой, он позволяет понять, как избежать конфликтов при совпадении именмежду своим кодом и кодом, написанным другими, поместив собственные классы вопределенное пространство имен.Глава 16. Пространства имен, препроцессор и компоновочные файлы435Ключевое СЛОВО u s i n g"Как разъяснялось в главе 2, если программа включает часто встречающиеся ссылкина определенные члены пространства имен, то необходимость указывать имя этогопространства имен при каждом к ним обращении, очень скоро утомит вас.
Эту проблему позволяет решить директива using. В примерах этой книги использовалась директива using, чтобы сделать текущим С#-пространство имен System, поэтому выуже с ним знакомы. Нетрудно предположить, что директиву u s i n g можно также использовать для объявления действующими пространств имен, создаваемых программистом.Существует две формы применения директивы using. Первая имеет такой вид:u s i n g имя;Здесь элемент имя означает имя пространства имен, к которому необходимо получить доступ. С этой формой директивы u s i n g вы уже знакомы. Все члены, определенные внутри заданного пространства имен, становятся частью этого (текущего) пространства имен, поэтому их можно использовать без дополнительного упоминания егоимени.
Директива u s i n g должна находиться в начале каждого программного файла,т.е. предшествовать всем остальным объявлениям.В следующей программе переработан пример использования счетчиков из предыдущего раздела, чтобы показать, как с помощью директивы u s i n g можно чтобы сделать текущим создаваемое программистом пространство имен.// Демонстрация использования пространства имен.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 v a l — ;else return 0;class NSDemo {public static void Main() {// Теперь класс CountDown можно использовать// без указания имени пространства имен.CountDown cdl = new CountDown(10);436Часть I. Язык С#inti;do {i = cdl.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();Эта программа иллюстрирует еще один важный момент: использование одногопространства имен не аннулирует другое.
При объявлении действующим некоторогопространства имен его имя просто добавляется к именам других, которые действуют вданный момент. Следовательно, в этой программе действуют пространства именSystem и Counter.Вторая форма использования директивы usingДиректива using обладает еще одной формой применения:using псевдоимя = имя;Здесь элемент псевдоимя задает еще одно имя для класса или пространства имен, •заданного элементом имя. Теперь программу счета в обратном порядке переделаемеще раз, чтобы показать, как создается псевдоимя Count для составного имениCounter.CountDown.// Демонстрация использования псевдоимени.using System;// Создаем псевдоимя для класса Counter.CountDown.using Count = Counter.CountDown;// Объявляем пространство имен для счетчиков.namespace Counter {// Простой счетчик для счета в обратном направлении.class CountDown {int val;лpublic CountDown(int n) {val = n;}p u b l i c v o i d r e s e t ( i n t n) {,Глава 16.
Пространства имен, препроцессор и компоновочные файлы437val= n;public int count() {if(val > 0) return v a l — ;else return 0;class NSDemo {public static void Main() {// Здесь Count используется в качестве имени// вместо Counter.CountDown.Count cdl = new Count(10);int i;do {i = cdl.count();Console.Write(i + " " ) ;} while(i > 0 ) ;Console.WriteLine();Count cd2 = new Count(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();После того как имя Count было определено в качестве еще одного имени для составного имени Counter.CountDown, его можно использовать для объявления объектов класса CountDown без уточняющего указания пространства имен.