Пространства имён в C#: организация кода и избежание конфликтов имён
Что такое пространство имён
Namespace (пространство имён) — контейнер для организации типов (классов, структур, интерфейсов, перечислений, делегатов). Позволяет избежать конфликтов имён: два класса MyClass в разных пространствах имён — это разные типы.
Объявление пространства имён
namespace MyCompany.MyProject.Module
{
public class MyClass { }
public struct MyStruct { }
public interface IMyInterface { }
}
Иерархия разделяется точками. Можно вкладывать:
namespace Outer
{
namespace Inner { }
// или
namespace Outer.Inner { }
}
Использование типов из пространств имён
1. Полное имя (fully qualified name)
System.Console.WriteLine("Hello");
MyCompany.Project.ClassName obj = new MyCompany.Project.ClassName();
2. Директива using
using System; // доступ к типам в System без префикса
using MyCompany.Project; // доступ к типам в MyCompany.Project
Console.WriteLine("Hello"); // вместо System.Console.WriteLine
var obj = new ClassName(); // вместо MyCompany.Project.ClassName
3. Псевдонимы (using alias)
using Project = MyCompany.Long.Namespace.Project;
using StringList = System.Collections.Generic.List;
Project.ClassName obj = new();
StringList list = new();
Полезно для разрешения конфликтов имён или сокращения длинных имен.
4. using static (C# 6.0+)
using static System.Console;
using static System.Math;
WriteLine(Sqrt(16)); // вместо Console.WriteLine(Math.Sqrt(16))
Пример: два класса с одинаковым именем
namespace FirstSpace
{
public class MyClass { public void Func() => Console.WriteLine("FirstSpace"); }
}
namespace SecondSpace
{
public class MyClass { public void Func() => Console.WriteLine("SecondSpace"); }
}
class Program
{
static void Main()
{
FirstSpace.MyClass f = new FirstSpace.MyClass();
SecondSpace.MyClass s = new SecondSpace.MyClass();
f.Func(); // FirstSpace
s.Func(); // SecondSpace
}
}
Вложенные пространства имён
namespace Company
{
namespace Department
{
namespace Team
{
public class Employee { }
}
}
}
// Доступ
Company.Department.Team.Employee emp = new();
using Company.Department.Team;
Employee emp2 = new();
Глобальное пространство имён
Если имя типа конфликтует с типом в глобальном пространстве, используйте префикс global:::
namespace System
{
class Console { } // перекрывает System.Console
}
class Test
{
static void Main()
{
global::System.Console.WriteLine("Real Console"); // доступ к настоящему
}
}
File-scoped namespaces (C# 10+)
Лаконичный синтаксис для файла с одним пространством имён:
namespace MyProject.MyModule;
public class MyClass { } // автоматически в MyProject.MyModule
Лучшие практики
- Именование:
Company.Product.Module(PascalCase) - Один файл — один тип (обычно), namespace соответствует структуре папок
- Избегайте глубокой вложенности (3-4 уровня максимум)
- Используйте
usingдирективы в начале файла - Группируйте
using: сначала System, потом сторонние, потом свои - Удаляйте неиспользуемые using (IDE делает это автоматически)
- Для конфликтов — псевдонимы (
using Alias = Long.Namespace.Type)
Язык C
- C# Hello World — создание вашего первого C# приложения
- Понимание ключевых слов и идентификаторов C#: правила, списки и лучшие практики
- Мастерство C# переменных и примитивных типов данных: полное руководство
- Операторы C# — исчерпывающее руководство по операторам в C#
- Освоение побитовых и сдвиговых операторов в C#: полное руководство
- Основы ввода-вывода в C#: Console.WriteLine, ReadLine и форматирование
- Выражения, операторы и блоки в C#: подробное руководство с примерами
- Освоение комментариев в C#: виды, лучшие практики и XML-документация
- Освоение оператора switch в C#: синтаксис, примеры и лучшие практики
- Тернарный оператор в C#: краткое руководство по условным выражениям