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

Пространства имен (namespace) позволяют выделять определенные части ваших приложений (классы, интерфейсы и т.д.) в логические блоки. Такой подход позволяет сделать код приложения более читабельным и понятным. Сама платформа .NET активно использует пространства имен для создания стройной и логичной структуры своих классов и объектов. Например, в пространстве имен System расположены все основные классы и объекты для работы (тот же класс Console), а в пространстве имен System.Text.Json — классы для работы с JSON и так далее.

  Чтобы определить пространство имен используется следующая конструкция:

namespace [название_пространства_имен]
{
  [код приложения]
}

С пространствами имен мы сталкиваемся уже на этапе знакомства с C#. Например, шаблонное консольное приложение для .NET 5 и более ранних версий выглядит следующим образом:

using System;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

Здесь уже создано пространство имен для нашего приложения — ConsoleApp1.

Использование пространств имен в проектах C#

Чтобы ваше приложение имело возможность использовать какие-либо классы платформы .NET необходимо подключить требуемое пространство имен в ваш проект. Для подключения пространства имен в проект используется ключевое слово using. Например, подключим к нашему проекту пространство имен, которое позволит работать с текстом:

using System;
using System.Text; //подключаем пространство имен

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StringBuilder stringBuilder = new();
            //для .NET Core 3.1 и более ранних версий: StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.AppendLine("Hello World");
            stringBuilder.AppendLine("Учимся подключать пространства имен");
            Console.WriteLine(stringBuilder.ToString());
        }
    }
}

Вложенные пространства имен

Пространства имен в C# могут быть вложенными. Например, мы можем организовать вот такую логическую структуру нашего проекта:

using System;
using System.Text; //подключаем пространство имен

namespace ConsoleApp1
{
    //вложенное пространство имен
    namespace MyNamespace
    {
        public class Data
        { 
            public string Name { get; set; } 
            public string Value { get; set; }   
        }
    }


    internal class Program
    {
        static void Main(string[] args)
        {
                       
        }
    }
}

Здесь мы определили вложенное пространство имен (namespace) MyNamespace. Теперь, чтобы использовать класс Data мы должны сделать так:

internal class Program
{
    static void Main(string[] args)
    {
        MyNamespace.Data data = new()
        {
            Name = "Привет",
            Value = "Мир!"
        };
    }
}

то есть, перед именем класса (Data) мы указываем название пространства имен (MyNamespace).

Хоть .NET C# и позволяет создавать вложенные пространства имен, но увлекаться таким подходом к организации проекта лучше не стоит, так как в итоге можно получить такую «логическую» структуру с которой и сам разработчик через год не разберется

Более предпочтительным с точки зрения читабельности и поддержки проекта является организация пространства имен непосредственно через обозреватель решений Visual Studio. По умолчанию Visual Studio создает новое пространство имен в проекте на каждую папку в проекте. Например, создадим в нашем проекте попку с именем Base:

Теперь кликнем по папке правой кнопкой мыши, выберем в меню пункт «Добавить» и «Создать элемент»:

Создадим новый класс с названием BaseClass:

Обратите внимание на то, какое имя пространству имен присвоила Visual Studio:

По умолчанию, Visual Studio создала новый класс в пространстве имен составленному по шаблону: [Имя_проекта].[Папка_с_файлом]

Аналогичным образом мы можем создать поддиректорию в папке Base и пространство имен снова будет соответствовать физическому пути на диске, например:

namespace ConsoleApp1.Base.Interfaces
{
    internal interface IView
    {
    }
}

Физически этот интерфейс располагается по пути /Base/Interfaces/IView.cs

Таким образом, мы, с одной стороны можем логически разделять отдельные классы и объекты по пространствам имен, а, с другой стороны — подобное разделение (с использованием папок) будет наглядно видно в «Обозревателе решений»:

Глобальные пространства имен и пространства имен уровня файла

Начиная с версии .NET 6 и C# 10 мы можем задавать глобальные пространства имен и пространства имен уровня файла.

Глобальные пространства имен

Глобальные пространства имен удобно использовать в том случае, если вам необходимо использовать это пространство имен во всем (или в большинстве файлов) проекте. Например, уже используемое нами пространство имен System можно определить как глобальное. Чтобы определить глобальное пространство имен необходимо перед его объявлением использовать ключевое слово global.

global using System; //глобальное пространство имен

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Привет Мир!");
        }
    }
}

Теперь нам нет необходимости в каждом файле проекта для которого необходимо использование пространства имен System использовать конструкцию using System;.

namespace ConsoleApp1.Base
{
    internal class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("Привет, Мир!");//класс Console взят из глобального пространства имен
        }
    }
}

Глобальные пространства имен можно определять в любом месте проекта, однако при этом, пространство имен с параметром global всегда должно находиться в коде выше, чем пространство имен без global:

Как можно видеть на скриншоте, Visual Studio указывает нам на то, что пространство имен с global необходимо перенести ВЫШЕ. И хоть мы имеем право определить глобальное пространство в любом удобном для нас месте, все же стоит придерживаться элементарных правил хорошего тона и постараться обеспечить поддержку нашего проекта в любом обозримом будущем. Поэтому все глобальные пространства имен лучше вынести в отдельный файл и назвать этот файл наиболее подходящим образом, например, GlobalUsings.cs или GlobalNamespaces.cs:

//Файл с глобальными пространствами имен
global using System; 
global using System.Data;
global using System.Data.Common;

В обозревателе решений этот файл находится на самом верхнем уровне в проекте:

Global namespace

Пространства имен уровня файла

Пространство имен уровня файла указывает на то, что всё, что содержится в файле относится к этому пространству имен. Чтобы определить пространство имен уровня файла в C# необходимо использовать конструкцию namespace без фигурных скобок, например:

//всё содержимое файла относится к этому пространству имен    
namespace ConsoleApp1.Base;

    internal class BaseClass
    {
        public BaseClass()
        {
        //класс Console взят из глобального пространства имен
        Console.WriteLine("Привет, Мир!");
        }
    }

Итого

Пространства имен в C# (namespace) — это, в первую очередь, логические структуры, которые позволяют разделить используемые в проекте классы и объекты по определенным признакам и сделать проект полее комфортным с точки зрения его поддержки. Начиная с .NET 6 C# 10, пространства имен могут быть глобальными (обозначаются ключевым словом global) и пространствами имен уровня файла.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии