Главное преимущество пространств имен заключается в том, что объявленные в них имена не вступают в конфликт с именами, объявленными за их пределами. Например, в приведенной ниже программе определяются два пространства имен. Первым из них является представленное ранее пространство имен 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; } }