C# Portal | Программирование: post #2317 — TG.ME

C# 12 убрал приличный кусок шаблонного кода, который вы пишете почти в каждом сервисном классе.

Если вы до сих пор для каждой зависимости объявляете поле, параметр конструктора и потом отдельно присваиваете одно другому, то пишете три строки там, где теперь нужна одна.

Возьмём обычный OrderService. Три readonly-поля. Конструктор с тремя параметрами. Ещё три строки внутри конструктора, где каждый параметр присваивается своему полю. Получается 13 строк, и почти все они нужны только для прокидывания зависимостей.

С первичным конструктором та же версия занимает около шести строк. Вы просто указываете зависимости прямо в объявлении класса: OrderService получает IOrderRepo repo, ILogger и IEmailSender email. После этого repo, logger и email можно напрямую использовать в методах.

Поведение то же, шаблонного кода почти нет.

Перед тем как переписывать всё подряд, стоит помнить три вещи.

Больше не нужно повторять каждую зависимость по три раза. Объявляете её один раз — в заголовке класса.

Параметры первичного конструктора доступны во всём классе, а не только внутри конструктора, поэтому к ним можно обращаться из любых методов.

Тестируемость при этом никуда не исчезает. Моки внедряются точно так же, как раньше.

Есть один нюанс, который может сэкономить вам час: параметры первичного конструктора не становятся полями автоматически. Если вам действительно нужно сохранить параметр именно как поле, сделайте это явно. Не додумывайте за компилятор — он сам подскажет.

Попробуйте сегодня открыть один сервисный класс и перевести его на первичный конструктор. Посчитайте строки до и после.

Разница — это тот шаблонный код, который вам больше не придётся писать.

👉 @KodBlog
👍11👎5❤3🥴2😈1
August 12, 2026 1.9K 14