Пространства имён
В мире существуют сотни, а может быть, и тысячи, улиц, названных именем А.С. Пушкина. Но если на конверте указана одна из них, то как письмо находит своего получателя? Естественно, адрес состоит не только из улицы. Мы, по меньшей мере, добавляем название страны и города.
Очевидно, если мы укажем адрес на конверте:
- улица Пушкина, 17;
- улица Пушкина, 82,
то почта не распознает, где эта улица и где этот дом.
Можно написать так:
- улица Пушкина, 17, г. Москва;
- улица Пушкина, 82, г. Алма-Ата
Так-то лучше, а если существуют два города с одинаковым названием? Например, город Москва есть в США! Поэтому для надежности добавим еще и название страны:
- улица Пушкина, 17, г. Москва, Российская Федерация;
- улица Пушкина, 82, г. Алма-Ата, Республика Казахстан.
В России адрес принято писать так:
- Российская Федерация, г. Москва, улица Пушкина, 17;
- Республика Казахстан, г. Алма-Ата, улица Пушкина, 82.
Теперь письмо обязательно дойдет до адресата. Например, второе письмо доставят самолетом в Республику Казахстан, из аэропорта его перевезут на почтамт города Алма-Аты, а потом почтальон пойдет на улицу Пушкина и найдет дом под номером 82.
Формат (Республика Казахстан, г. Алма-Ата, ул. Пушкина) можно считать "пространством имен" для отправки писем.
Пространства имен и программный код
Какое же отношение все это имеет к программированию?
Предположим, разработчиками корпорации Microsoft написан класс "Point", используемый для рисования фигуры в определеннойточке, но и вы создали класс с именем "Point", например, для загрузки фотографии человека, указывающего на что-либо.
Примечание редактора. Слово Point в английском языке многозначное и означает как "точку", так и глагол "указывать".
Очевидно, что оба класса выполняют абсолютно разные действия, но и тот и другой можно назвать Point. С каким же из них будет работать программа?
Безусловно, имеет смысл использовать разные имена. В среде .NET для этого можно задействовать различные "пространства имен". Например, так:
- Microsoft.Drawing.Point
- Anna.PictureStuff.Point
Имена классов сохранены ( Point ), но пространства имен перед именами класса позволяют четко видеть, в каком из них находится класс. И теперь, если мне нужно использовать класс Point из пространства Anna, я могу создать объект Point при помощи следующего метода-конструктора:
Anna.PictureStuff.Point annaPoint = new Anna.PictureStuff.Point();
Для работы с классом Point от Microsoft подойдет следующий код:
Microsoft.Drawing.Point microsoftPoint = new Microsoft.Drawing.Point();
Несмотря на то что оба моих объекта принадлежат классу Point, они относятся к разным классам и выполняют разные действия.
Как создать пространство имен и поместить в него собственный класс
Разместить собственный класс в пространстве имен очень просто. Раньше мы давали описание класса следующим образом:
Теперь создайте пространство имен и внутри него опишите класс:
namespace Anna
{
class Animal
{
...
}
}
Или, если хотите, сделайте так:
namespace Anna.FunStuff
{
class Animal
{
...
}
}
Пространства имен могут быть вложенными друг в друга. Тогда их имена разделяются точками. В последнем примере классAnimal входит в пространство имен Anna.FunStuff.
Все библиотеки классов, которые предлагают разработчики Майкрософт, а также других организаций, помещаются в пространства имен. Поэтому, прежде чем использовать код из таких библиотек, необходимо понимать, как работать с пространствами имен.
Строительный блок: Пространство имен |
Для логического объединения классов одной тематики рекомендуется помещать их в одно пространство имен. Имя пространства должно иметь содержательный смысл. |
namespace Charles.SchoolUtilities
{
class Animal
{
}
}
|
Экземпляр или объект приведенного выше класса можно создавать, вызывая конструктор класса. |
Charles.SchoolUtilities.Animal cat;
cat = new Charles.SchoolUtilities.Animal();
|
Если нужно создать много объектов одного пространства имен, то в начале программы в предложении "using" можно указать пространство имен. Тогда компьютер сам будет находить классы в этом пространстве. |
// говорим компьютеру, что будем использовать
//классы из этого пространства имен
using Charles.SchoolUtilities;
// создание объекта Animal из пространства
//имен Charles.SchoolUtilities
Animal cat = new Animal();
|
|