Неформальное введение в объектно-ориентированное программирование на платформе Net.Framework.

(c)Герман Иванов.

Статья пятая(фрагмент).Пространство имен.

Пространство имен используется в Net.Framework для того, чтобы объединять в единое целое блоки кода. Объединяются они в рамках какого-либо одного вашего проекта или по признаку выполнения сходной функциональности в иерархии Net.Framework.

Выглядит объявление namespace следующим образом.


namespace xxxxx {

:

}


Где xxxxxx - название вашего проекта. Этот блок кода ограничивает весь ваш вновь созданный с помощью мастера класс.

За счет использования пространства имен у программиста не болит голова о том, а не имеется ли случаем, где-либо в недрах Net.Framework, объект который уже называется точно также как тот, новый, который он собрался создать. По своей сути пространство имен это нечто вроде обычной "папки" Windows, в которую вложены "файлы" (в которых хранятся различные классы) и другие папки (вложенные пространства имен). Давайте продолжим эту аналогию и посмотрим, насколько она удачна.

У вас на винчестере запросто может быть две совершенно разные папки, в которых находятся одинаково называющиеся файлы, а вот создать два файла с одинаковым именем в одной папке нельзя. Также дело обстоит и в Net.Framework. В разных пространствах имен могут находиться классы, имеющие одинаковые имена, а в одном пространстве имен такие классы создавать нельзя.

Папки Windows помогают упорядочивать файлы на вашем диске. Если мы видим на диске C: папку под названием "Мои документы" то вполне логично можем предположить, что в ней хранятся документы созданные пользователем. Так и в Net.Framework, если мы видим, скажем, пространство имен System.Text, то вполне верно предполагаем, что там находятся классы, предназначенные для обработки текстов.

Когда вы хотите в Windows указать путь к файлу, сквозь последовательность вложенных папок, вы пользуетесь символом "\". К примеру, путь к файлу "sysoc.inf" находящемся в папке "System32",в свою очередь находящейся в папке "Windows", расположенной в корне диска "C:", записывается как "c:\windows\system32\sysoc.inf". В Net.Framework символом разделителем при описании пути сквозь пространство имен служит символ точки ".". Так, если вы хотите сослаться на класс "RegularExpressions", находящийся в пространстве имен "Text", вложенном, в свою очередь, в пространство имен "System" следует указать такой путь "System.Text.RegularExpressions".

Подобная форма структурирования кода имеет массу достоинств. Вместе с тем, она приводит к тому, что вам придется, ссылаясь на объект, описывать весь путь к нему, а это довольно много лишней "писанины". Впрочем, на самом деле, все не так страшно как кажется на первый взгляд.

Во-первых, в Visual Studio встроена нежно любимая многими, и мной в том числе, технология IntelliSense. Как только вы напишете в редакторе Visual Studio слово System и поставите после него точку, активизируется выпадающий список, в котором вам будет предложено выбрать вложенные в System классы или пространства имен. После того как вы выберете, скажем, Text, поставьте опять точку и вам будет предложен для выбора список вложенных уже в Text пространств имен и классов.

Этот "список" довольно интеллектуален. В зависимости от того места в тексте программы, где вы его вызвали, показывает только те пространства имен, классы и свойства которые допустимо использовать в данном месте кода. Поэтому не удивляйтесь, если не сможете найти в нем что-либо, что заведомо должно в нем присутствовать. Просто сместитесь на правильный фрагмент в своем коде. Не стоит, к примеру, пытаться описывать using внутри какого-либо класса, место этой директивы в самом начале файла с кодом.

Если бы единственным способом указать путь сквозь пространство имен была технология IntelliSense, жизнь программиста на C# все равно была бы довольно печальной, несмотря на все достоинства этой технологии. К счастью IntelliSense возможности Net.Framework не ограничиваются. Если вы, в своем модуле, часто используете объекты из какого либо пространства имен, вы можете указать его в начале модуля с помощью кодового слова "using". После этого, вы можете вызывать объект, из этого пространства, просто набрав его имя без указания пути. Так, для примера, если вам часто приходится пользоваться в коде объектом RegularExpressions, то вместо того, чтобы каждый раз писать System.Text.RegularExpressions, один раз укажите в начале файла using System.Text, в дальнейшем вы можете просто писать RegularExpression, не указывая полного пути. Вернувшись к нашей аналогии с папками Windows, заметим, что подобная техника очень сильно напоминает работу переменной Path в среде Windows/MSDOS.

Директив using может быть указано столько, сколько вам нужно для комфортной работы с объектами Net.Framework или созданными вами самим пространствами имен. Наверняка у вас возникнет вопрос, а что произойдет, если я укажу несколько директив using, и в выбранных мной, с ее помощью, пространствах имен, окажутся одинаково названные объекты? Хороший вопрос. Сразу замечу, что выбор пространства имен директивой using не приводит к немедленному копированию всех содержащихся в нем классов в ваш код. Это не более чем способ кратко оформлять текст вашей программы. Неоднозначность может возникнуть лишь в момент объявления конкретного типа объекта в вашей программе. Net.Framework предоставляет вам три способа выкрутится из такой ситуации. Впрочем, это я придумал три способа, возможно, их намного больше.

Первый способ:

Ссылаясь на дублирующиеся объекты, указывайте полное имя с указанием пути. Игнорируя указание директивы using, просто пишите объявления этих неуживчивых классов так, как будто никакой директивы using не было в помине. В этой ситуации Net.Framework не остается ничего другого, как отказаться от своей интеллектуальности, и создать именно тот класс, который вы просите.

Второй способ:

Используйте неполный путь в директиве using. Возьмем простой пример. Скажем, у нас есть два пространства имен MyProject.MyClasses1 и MyProject.MyClasses2. В каждом из них присутствует класс называющийся MyClass. Вместо того чтобы указывать две директивы "using MyProject.MyClasses1" и "using MyProject.MyClasses2" напишите одну директиву "using MyProject", а объект вызывайте либо как "MyClasses1.MyClass" либо как "MyClasses2.MyClass".

Третий способ (мой любимый):

Используйте специальную форму директивы "using", при которой пространству имен присваивается удобное вам "прозвище"(Alias). Выглядит такая форма записи следующим образом:


using streg = System.Text.RegularExpressions;


где "streg" - это alias который я выбрал для пространства имен "System.Text.RegularExpressions". Обратите внимание: это я выбрал "streg", вы можете выбрать любую другую удобную вам аббревиатуру. Название конкретного алиаса может быть любым. В дальнейшем, вы можете обращаться к пространству имен System.Text.RegularExpressions с помощью краткой формы записи "streg".

Например, таким образом:


streg.Regex reg = new streg.Regex();


Во всех приведенных мной случаях вы избежите ситуации с возможной неоднозначностью имен в вашей программе.

Способ с алиасами удобен еще и тем, что при такой форме записи, набрав алиас (streg) и поставив точку, вы получите подсказку от IntelliSense обо всех входящих в это пространство имен классах.

Так как очень трудно запомнить названия всех классов в Net.Framework, я сам пользуюсь алиасами даже тогда, когда в моем коде нет конфликтов имен классов. Возможность быстро подставить в свой код правильное имя класса, о котором вы знаете лишь то, что он объявлен где-то в недрах System.Data и его название оканчивается, вроде бы, на xxxColumn существенно ускоряет написание кода. Помимо этого, вам не нужно теперь заучивать имена всех классов в Net.Framework. С помощью технологии IntelliSense вы всегда сможете быстро отыскать тот класс, который вам потребовался.

Помните мою вторую статью из этого цикла? Прощай проблема "семь:десять объектов, которыми человеческий мозг может оперировать одновременно". Когда я только приступал к изучению Net.Framework передо мной встала задача написать несложную консольную программу, изменяющую, нужным мне образом, некий ключ в реестре. Я сел, в задумчивости глядя на совершенно незнакомый мне тогда язык C#, и написал using Microsoft. Среда услужливо мне подсказала, вам, мол, дальше куда? Предлагаю на выбор: CSharp, VisualBasic или Win32. Win32 разумеется! - ответил я. Выпавший, вслед за моим выбором, список оказался на этот раз более длинным, но слово Registry мне бросилось в глаза сразу. Дальше дело техники и нужную программу я написал минут за пятнадцать. Совсем неплохо для человека, только-только начинающего знакомится с новым языком программирования!

 

Ссылки:


При перепечатке сохранение раздела "Ссылки" обязательно!!!