Содержание
Пространства имен (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
).
Более предпочтительным с точки зрения читабельности и поддержки проекта является организация пространства имен непосредственно через обозреватель решений Visual Studio. По умолчанию Visual Studio создает новое пространство имен в проекте на каждую папку в проекте. Например, создадим в нашем проекте попку с именем Base:
Теперь кликнем по папке правой кнопкой мыши, выберем в меню пункт «Добавить» и «Создать элемент»:
Создадим новый класс с названием BaseClass
:
Обратите внимание на то, какое имя пространству имен присвоила Visual Studio:
По умолчанию, Visual Studio создала новый класс в пространстве имен составленному по шаблону: [Имя_проекта].[Папка_с_файлом]
Аналогичным образом мы можем создать поддиректорию в папке Base и пространство имен снова будет соответствовать физическому пути на диске, например:
namespace ConsoleApp1.Base.Interfaces { internal interface IView { } }
Физически этот интерфейс располагается по пути /Base/Interfaces/IView.cs
Таким образом, мы, с одной стороны можем логически разделять отдельные классы и объекты по пространствам имен, а, с другой стороны — подобное разделение (с использованием папок) будет наглядно видно в «Обозревателе решений»:
Глобальные пространства имен и пространства имен уровня файла
Глобальные пространства имен
Глобальные пространства имен удобно использовать в том случае, если вам необходимо использовать это пространство имен во всем (или в большинстве файлов) проекте. Например, уже используемое нами пространство имен 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;
В обозревателе решений этот файл находится на самом верхнем уровне в проекте:
Пространства имен уровня файла
Пространство имен уровня файла указывает на то, что всё, что содержится в файле относится к этому пространству имен. Чтобы определить пространство имен уровня файла в C# необходимо использовать конструкцию namespace
без фигурных скобок, например:
//всё содержимое файла относится к этому пространству имен namespace ConsoleApp1.Base; internal class BaseClass { public BaseClass() { //класс Console взят из глобального пространства имен Console.WriteLine("Привет, Мир!"); } }
Итого
Пространства имен в C# (namespace
) — это, в первую очередь, логические структуры, которые позволяют разделить используемые в проекте классы и объекты по определенным признакам и сделать проект полее комфортным с точки зрения его поддержки. Начиная с .NET 6 C# 10, пространства имен могут быть глобальными (обозначаются ключевым словом global
) и пространствами имен уровня файла.