На этом шаге мы рассмотрим создание и использование пользовательского пространства имен.
Мы многократно использовали самые разные пространства имен. Теперь пришло время познакомиться с концепцией пространства имен поближе. Для начала отметим, что пространство имен используется для определения области уникальности имен: названия классов, структур, делегатов, интерфейсов и перечислений, объявленных в одном пространстве имен, должны быть уникальными. Другими словами, пространство имен - это некоторое множество классов и других утилит, и в пределах пространства имен названия этих утилит не могут совпадать. Например, два класса в одном и том же пространстве не могут иметь одинаковые названия. Зато если классы относятся к разным пространствам имен, то названия классов могут и совпадать.
Мы уже знаем, что если в программе нужно использовать пространство имен, то в начале файла с программой размещается инструкция using, после которой указывается название пространства имен. В результате классы, структуры и прочие утилиты, описанные в пространстве имен, станут доступны в программе. Если пространство имен не подключено с помощью инструкции using, то для обращения к утилитам из этого пространства необходимо перед именем утилиты (например, класса, структуры, интерфейса) указывать название пространства имен. Например, если класс MyClass описан в пространстве имен MySpace, то обращение к такому классу выполняется инструкцией вида MySpace.MyClass.
Мы можем не только подключать уже существующие пространства имен, но и описывать собственные. Делается это просто: после ключевого слова namespace указывается название пространства имен, и в блоке из фигурных скобок описываются классы, структуры, интерфейсы, перечисления и делегаты, которые входят в это пространство имен.
Следовательно, шаблон описания пространства имен следующий:
namespace имя { // Содержимое пространства имен }
Ниже представлен небольшой пример, иллюстрирующий процесс описания пространства имен. В этой программе описаны два пространства имен First и Second, и каждое пространство имен содержит описание класса MyClass (то есть пространства имен содержат разные классы с совпадающими названиями).
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr287_1 { // Первое пространство имен: namespace First { // Описание класса: class MyClass { public int num; public MyClass(int n) { num = n; } public void show() { Console.WriteLine("Класс из First: " + num); } } } // Второе пространство имен: namespace Second { // Описание класса: class MyClass { public string txt; public MyClass(string t) { txt = t; } public void show() { Console.WriteLine("Класс из Second: " + txt); } } } // Главный класс: class Program { // Главный метод: static void Main() { // Объект класса из первого пространства имен: First.MyClass A = new First.MyClass(123); // Объект класса из второго пространства имен: Second.MyClass B = new Second.MyClass("text"); // Использование объектов: A.show(); B.show(); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы такой, как показано ниже:
Рис.1. результат работы приложения
Как отмечалось выше, оба пространства (First и Second) содержат описание класса. Классы имеют одинаковые названия MyClass, они однотипны, но это разные классы. Поскольку они относятся к разным пространствам имен, то совпадение их названий проблемой не является. Мы в программе для подключения пространств имен First или Second инструкцию using не используем, поэтому обращение к классу из пространства имен First выполняется в формате First.MyClass, а обращение к классу из второго пространства имен выполняется инструкцией вида Second.MyClass. На основе этих классов создаются объекты (команды
First.MyClass A = new First.MyClass(123); и Second.MyClass B = new Second.MyClass("text");
На следующем шаге мы закончим изучение этого вопроса.