TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2342 2.6K
День 1937. #ЗаметкиНаПолях
Введение в Первичные Конструкторы в C#12. Начало

Первичные конструкторы были впервые представлены в C#9 как часть функциональности записей. В C#12 они стали доступны обычным типам классов и структур.

Чтобы создать тип Person до C#12 нужно было бы написать примерно такой класс:
public class Person
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; }
public string LastName { get; }
}

Здесь много дублирования. Первичные конструкторы позволяют упростить определение и уменьшить дублирование.

Способы использования параметров первичного конструктора:
1. Инициализировать члены (или передать их базовому конструктору).
2. Использовать прямую ссылку на параметры.

1. Инициализация членов параметрами
Инициализация членов напрямую аналогична определению класса, показанному выше, но уменьшает часть дублирования и, как правило, более компактна:
public class Person(string firstName, string lastName)
{
public string FirstName { get; } = firstName;
public string LastName { get; } = lastName;
}

Мы почти вдвое сократили количество кода, при этом сохранив его намерение понятным и очевидным. Заметьте, здесь мы используем классы, но для структур всё будет так же. Аналогично можно задать и приватные поля:
public class Person(string firstName, string lastName)
{
private readonly string _firstName = firstName;
private readonly string _lastName = lastName;

public string FullName => $"{_firstName} {_lastName}";
}

Но первичные конструкторы позволяют вам убрать определения полей совсем.

2. Ссылаемся на параметры конструктора в членах класса
Если значения приватных полей не используются нигде, кроме свойства FullName, мы можем использовать первичный конструктор, чтобы ещё больше «упростить» класс:
public class Person(string firstName, string lastName)
{
// Напрямую ссылаемся на
// параметры первичного конструктора
public string FullName => $"{firstName} {lastName}";
}

Но мы можем пойти и дальше, и изменять параметры первичного конструктора:
public class Person(string firstName, string lastName)
{
…
public void SetName(string first, string last)
{
firstName = first;
lastName = last;
}
}

Если вы выполните следующий код, вы увидите, что параметры конструктора изменяемые:
var p = new Person("Andrew", "Lock");
p.SetName("Jon", "Smith");
Console.WriteLine(p.FullName); // "Jon Smith"

Далее рассмотрим, как это работает «под капотом».

Окончание следует…

Источник:
https://andrewlock.net/an-introduction-to-primary-constructors-in-csharp-12/
  • 👍 13
More from @netdeveloperdiary
  1. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  2. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  3. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  4. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 3, 2026Post #3360
  6. Oct 3, 2026День 2803. #Оффтоп Чем Заняться, Пока Работают Агенты? У VS Code Есть Ответ Сейчас большую…
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 →