Введение в Первичные Конструкторы в 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/