TGViewer
НеСерьезный шарпист НеСерьезный шарпист @serious_seesharp · 2.4K subscribers
Post #81 3.46K
👩‍💻 Когда в C# 12 появились primary constructors (первичные конструкторы класс/структур), то я почему-то думал, что параметры данного сахара разворачиваются в приватные ридонли поля, для обеспечения иммутабельности. Однако по какой-то причине авторы ушли в другую сторону, и это теперь даже не поля))

Да, в ранних версиях предложения первичного конструктора, он должен был работать так же, как в record типах, но генерирующим приватные поля вместо открытого свойства. Однако во время разработки команда C# решила изменить поведение. И имеем следующее, что параметры первичного конструктора — это просто переменные, как в обычном конструкторе, но они оказываются в области видимости всего типа. То есть по факту данные параметры не влияют на состояние объекта и мы не можем, например, обратиться к ним через this, это просто не скомпилируется.

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

Самый простой - запрет на использование primary constructor. И за это можно получить кучу навоза в лицо от коллег, которые будут отстаивать, что все безопасно и все пишут хороший код.

Второй вариант - явное создание readonly полей с такими же наименованиями, что и у параметров первичного конструктора. В таком случае параметры перекроются и не будут больше доступны после присвоения полям.

😡 Плохо
public class GetRequestQuery(
ReadOnlyContext context,
IEquipmentService equipmentService)
{
// ...
}


👍 Хорошо
public class GetRequestQuery(
ReadOnlyContext _context,
IEquipmentService _equipmentService)
{
private readonly ReadOnlyContext _context = _context;
private readonly IEquipmentService _equipmentService = _equipmentService;

// ...
}


👍 И есть еще один интересный инструмент на сорс генераторах, который мне посоветовал товарищ СтепВан. Он позволяет нам написать все необходимые readonly поля, и с ними будет сгенерирован коснтруктор. Выглядит весьма прикольно, но с колегами говном покидаться все равно придется.
[PrimaryConstructor]
public partial class GetRequestQuery
{
private readonly ReadOnlyContext _context;
private readonly IEquipmentService _equipmentService;

// ...
}
  • 👍 12
  • ❤ 8
  • 🤡 5
  • 👎 2
  • 🔥 2
  • 🤔 1
  • 🌚 1
More from @serious_seesharp
  1. Jul 11, 2026Знакомый создал бота @booster_tbot, для прохождения мок-собесов бесплатно, а вопросы основ…
  2. Jun 30, 2025Всем, привет! Мы сейчас начинаем отбор докладов на осеннюю конфу "Стачка" в Питере. Если у…
  3. Jun 28, 2025Столкнулся с тем, что, как выяснилось, не всем очевидно для чего нужен ValueTask и когда е…
  4. Jun 5, 2025Post #85
  5. May 24, 2025Давно хотел сделать розыгрыш, и вот, кажется, время настало 🥰 Не надо никуда ничего скиды…
  6. May 21, 2025Вечером 29 мая состоится трансляция питерского .NET-митапа от SpbDotNet и Altenar Зрители…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →