Содержание
Пространства имен (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) и пространствами имен уровня файла.





