C# 4.0 полное руководство - 2011
Шрифт:
Для того чтобы скомпилировать эту программу, вы должны включить приведенный выше код в отдельный файл и указать его вместе с упоминавшимся выше файлом, содержащим код объявления пространства имен Counter. Если этот код
находится в файле NSDemo. cs, а код объявления пространства имен Counter — в файле Counter. cs, то для компиляции программы используется следующая командная строка.
csc NSDemo.cs counter.cs
Некоторые
Counter.CountDown cdl = new Counter.CountDown(10);
Это правило можно обобщить: всякий раз, когда используется член пространства имен, его имя необходимо дополнительно определить с помощью этого пространства имен. В противном случае член пространства имен не будет обнаружен компилятором.
Во-вторых, как только объект типа Counter будет создан, дополнительно определять его члены с помощью пространства имен уже не придется. Следовательно, метод cdl. Count может быть вызван непосредственно без дополнительного указания пространства имен, как в приведенной ниже строке кода.
i = cdl.Count;
И в-третьих, ради наглядности примера рассматриваемая здесь программа была разделена на два отдельных файла. В одном файле содержится код объявления пространства имен Counter, а в другом — код самой программы NSDemo. Но оба фрагмента кода можно было бы объединить в единый файл. Более того, в одном файле исходного кода может содержаться два или более пространства имен со своими собственными областями объявлений. Когда оканчивается действие внутреннего пространства имен, возобновляется действие внешнего пространства имен — в примере с Counter это глобальное пространство имен. Ради большей ясности в последующих примерах все пространства имен, требующиеся в программе, будут представлены в одном и том же файле. Следует, однако, иметь в виду, что их допускается распределять по отдельным файлам, что практикуется чаще в выходном коде.
Предотвращение конфликтов имен с помощью пространств имен
Главное преимущество пространств имен заключается в том, что объявленные в них имена не вступают в конфликт с именами, объявленными за их пределами. Например, в приведенной ниже программе определяются два пространства имен. Первым из них является представленное ранее пространство имен Counter, а вторым — Counter2. Оба пространства имен содержат классы с одинаковым именем CountDown, но поскольку это разные пространства, то оба класса CountDown не вступают в конфликт друг с другом. Кроме того, оба пространства имен определены в одном и том же файле. Как пояснялось выше, это вполне допустимо. Безусловно,
// Пространства имен предотвращают конфликты имен.
// Объявить пространство имен 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 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;
Вот к какому результату приводит выполнение этой программы.
10 987654 3.210
Это метод Count из пространства имен Counter2.
Как следует из приведенного выше результата, класс CountDown из пространства имен Counter существует отдельно от класса того же названия из пространства имен Counter2, и поэтому конфликт имен не возникает. Несмотря на всю простоту данного примера, он наглядно показывает, как удается избежать конфликта имен в собственном коде и коде, написанном другими разработчиками, поместив классы с одинаковыми именами в разные пространства имен.
Директива using
Если в программе присутствуют частые ссылки на члены конкретного пространства имен, то указывать это пространство всякий раз, когда требуется ссылка на него, не очень удобно. Преодолеть это затруднение помогает директива using. В подавляющем большинстве приводившихся ранее примеров программ с помощью этой директивы делалось видимым глобальное для C# пространство имен System, поэтому она отчасти вам уже знакома. Как и следовало ожидать, с помощью директивы using можно сделать видимыми вновь создаваемые пространства имен.