Пространства имен в C#

Пространства имен

В этой статье я хочу рассказать о пространствах имен в C#. Пространство имен (namespace) в C# представляет собой некий контейнер для логического объединения именованных сущностей, таких как классы, интерфейсы, перечисления и тому подобное. Для чего нужны такие контейнеры? Ну во-первых, пространства имен позволяют логически группировать классы и другие сущности, а во-вторых, позволяют использовать одни и те же имена для сущностей в разных пространствах имен. Причем, вторая функция даже больше востребована, так как логическую группировку тех же классов, программист может игнорировать, особенно, если классов не так много, а вот создать два класса с одним именем уже нельзя, не даст компилятор! 

Как создаются пространства имен? Да всё просто, мы уже сталкивались с ними. При создании нового проекта в Visual Studio автоматически создавалось пространство имен. Рассмотрим код основного файла только что созданного, консольного приложения:

//Блок подключения других пространств имен
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

//Пространство имен с названием "TestProject"
namespace TestProject
{ //Начало пространства имен
    //Основной класс программы
    class Program
    { 
        //Главный метод программы (точка входа)
        static void Main(string[] args)
        {
 
        }
    }
} //Конец пространства имен

Обратите внимание на выделенную строку, в ней и создается пространство имен, т.е. для этого используется ключевое слово namespace, после которого, через пробел, указывается название пространства имен. И всё, что объявляется внутри фигурных скобок, следующих на за названием, относится к пространству имен.

А теперь, давайте разберемся, как же пространства имен, позволяют использовать одни и те же имена для сущностей. Дело в том, что пространство имен, как бы задает префикс к имени любой сущности, в нем объявленной. Но мы этого не замечаем, если работаем с этой сущностью в том пространстве имен, в котором она объявлена. Таким образом имя сущности, например класса, на сомом деле становится ка бы составным. Сейчас я покажу как это выглядит на практике, для этого представим,что у нас есть класс «SomeClass«, который объявлен в пространстве имен «SomeNamespace«, тогда доступ к этому классу из метода «Main» был бы примерно таким:

//Главный метод программы (точка входа)
static void Main(string[] args)
{
    //Создание объекта класса SomeClass из пространства имен SomeNamespace
    SomeNamespace.SomeClass tmpObj = new SomeNamespace.SomeClass();
} 

Т.е. перед указанием имени класса, указывает имя пространства имен, к которому он принадлежит, а уже потом, через точку — имя самого класса. Пространство имен «SomeNamespace«, как бы ограничивает область видимости для класса «SomeClass«, и получить доступ, к этому классу мы можем только через пространство имен, его содержащее.

А теперь представим, что у нас есть еще один класс с именем «SomeClass«, но принадлежащий пространству имен «OtherNamespace«, и тогда создание его объекта в том же методе «Main» будет таким:

//Главный метод программы (точка входа)
static void Main(string[] args)
{
    //Создание объекта класса SomeClass из пространства имен OtherNamespace
    OtherNamespace.SomeClass tmpObj = new OtherNamespace.SomeClass(); 
} 

Как видите, используя пространства имен, мы можем конкретно указать нужный нам класс, если его имя совпадает с каким-либо классом из другого пространства имен. Но мы получаем и побочный эффект — имена сущностей становятся длиннее, и не всегда хочется писать лишний код. К счастью, выход есть и из этой ситуации. Если мы точно уверены, что ни одна сущность из пространства имен «SomeNamespace» не будет создавать конфликты имен с сущностями текущей области видимости, мы можем его подключить («раскрыть») всего одной строкой кода:

using SomeNamespace;

Которую добавляют, как правило, в самом начале файла с исходным кодом (обратите внимание на начало первого из примеров). И тогда, в методе «Main», мы сможем создавать объект класса «SomeClass» так (без явного указания пространства имен, к которому он принадлежит):

//Главный метод программы (точка входа)
static void Main(string[] args)
{
    //Создание объекта класса SomeClass из пространства имен SomeNamespace
    SomeClass tmpObj = new SomeClass();
} 

Но подключить оба наших вымышленных пространства имен в одном файле, мы уже не сможем, так как, они содержать две одноименных сущности (в данном случае, два класса «SomeClass»).

Так же, пространства имен могут быть вложенными, т.е. одно пространство имен может находиться внутри другого, например так:

//Какое-то пространство имен
namespace SomeNamespace
{
    //Вложенное пространство имен
    namespace OtherNamespace
    {
        //Некий класс
        class SomeClass
        { 
 
        }
    }
}

В приведенном примере, класс «SomeClass» принадлежит пространству имен «OtherNamespace«, а то, в свою очередь, вложено в пространство «SomeNamespace«. А полное имя класса «SomeClass» будет таким:

SomeNamespace.OtherNamespace.SomeClass

Вот, пожалуй, и вся основная информация о пространствах имен в C#, Вы узнали что это такое, как их создавать, как подключать пространства имен.

Добавить комментарий