Введение в Первичные Конструкторы в C#12. Окончание
Начало
Отличный способ понять многие новые функции C#, особенно те, которые по сути являются синтаксическим сахаром, — использовать Sharplab.io, чтобы увидеть, как компилятор «понижает» функции до более простого C#.
В примере, где мы инициализировали приватные поля через первичный конструктор, компилятор просто сгенерировал код обычного конструктора за нас.
А вот если мы используем параметры первичного конструктора в членах класса, код будет очень похож, но всё же отличаться.
Если вы ссылаетесь на параметры основного конструктора где-либо, кроме инициализатора поля или свойства, компилятор автоматически сгенерирует поля с невалидными в обычном C# именами, типа
private string <firstName>P;
для хранения значений параметров, поэтому их можно использовать в других методах и свойствах. Это одна из важных особенностей первичных конструкторов классов.
Добавление проверки к инициализации
Одной из общих проблем, связанных с такими функциями, как первичные конструкторы, является проблема «роста». Есть риск, что функция отлично работает в простых случаях, но как только вам нужно что-то более сложное, приходится полностью от неё отказаться.
Например, в конструкторы обычно добавляют код проверки на null или недопустимость аргументов. В первичных конструкторах их по-прежнему можно использовать:
public class Person(string firstName, string lastName)
{
private readonly string _firstName =
firstName
?? throw new ArgumentNullException(nameof(firstName));
private readonly string _lastName =
IsValidName(lastName)
? lastName
: throw new ArgumentNullException(nameof(lastName));
public string FullName => $"{_firstName} {_lastName}";
private static bool IsValidName(string name)
=> name is not "";
}
Вот результат компиляции.
Конечно, с этим кодом инициализации можно зайти далеко, и в определённый момент, вероятно, имеет смысл отказаться от первичного конструктора и использовать обычный. Стоит отметить, что вы можете добавить проверку параметров конструктора, только если вы используете их для инициализации, но не если вы ссылаетесь на них напрямую.
Мы рассмотрели большинство важных возможностей первичных конструкторов, но не затронули одного вопроса: надо ли их использовать? Об этом в будущих постах.
Источник: https://andrewlock.net/an-introduction-to-primary-constructors-in-csharp-12/