Как пространство имён (namespace) в C# соотносится с именем файла?

«Как пространство имён (namespace) в C# соотносится с именем файла?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C# нет прямой связи между пространством имён (namespace) и именем файла. Это обеспечивает гибкость в организации кода.

Ключевые принципы:

  1. Один namespace — много файлов: Классы из одного пространства имён могут быть распределены по разным файлам.
  2. Один файл — много namespace: В одном файле .cs можно объявить несколько пространств имён.
  3. Имя файла — это соглашение: Обычно файл называют по имени основного содержащегося в нём класса (например, UserService.cs для класса UserService), но компилятору это безразлично.

Примеры:

Пример 1: Один namespace в двух файлах

// Файл: User.cs
namespace MyApp.Data.Models
{
    public class User { /* ... */ }
}

// Файл: Product.cs
namespace MyApp.Data.Models
{
    public class Product { /* ... */ }
}
// Оба класса принадлежат одному пространству имён MyApp.Data.Models

Пример 2: Несколько namespace в одном файле

// Файл: CommonTypes.cs
namespace MyApp.Core
{
    public class Result<T> { /* ... */ }
}

namespace MyApp.Infrastructure.Exceptions
{
    public class ValidationException : Exception { /* ... */ }
}

Пример 3: Вложенные namespace (синтаксис с точками)

// Файл: Services.cs
namespace MyApp.Business.Services;
// Эквивалентно: namespace MyApp.Business.Services { ... }

public class OrderService { /* ... */ }

Почему так сделано? Это позволяет логически группировать код по функциональности, а не по физическому расположению файлов, что критично для больших проектов и частичных классов (partial class).