Найти в Дзене
Блог Дотнет

Добро пожаловать в C# 9.0 часть 1.

C# 9.0 обретает форму, и мы хотели бы поделиться нашим мнением о некоторых основных функциях, которые мы добавляем в эту следующую версию языка. С каждой новой версией C# мы стремимся к большей ясности и простоте в общих сценариях кодирования, и C# 9.0 не является исключением. В этот раз особое внимание уделяется поддержке краткого и неизменного представления форм данных. Init-only свойства Инициализаторы объектов довольно удивительны. Они дают клиенту тип очень гибкий и читаемый формат для создания объекта, и они особенно хороши для создания вложенных объектов, где целое дерево объектов создается за один раз. Вот простой пример: Инициализаторы объектов также освобождают автора типа от написания большого количества шаблонов - все, что им нужно сделать, это написать некоторые свойства! Единственное большое ограничение сегодня заключается в том, что свойства должны быть изменяемыми, чтобы инициализаторы объектов работали: они функционируют, сначала вызывая конструктор объекта (в данном
Оглавление

C# 9.0 обретает форму, и мы хотели бы поделиться нашим мнением о некоторых основных функциях, которые мы добавляем в эту следующую версию языка.

С каждой новой версией C# мы стремимся к большей ясности и простоте в общих сценариях кодирования, и C# 9.0 не является исключением. В этот раз особое внимание уделяется поддержке краткого и неизменного представления форм данных.

Init-only свойства

Инициализаторы объектов довольно удивительны. Они дают клиенту тип очень гибкий и читаемый формат для создания объекта, и они особенно хороши для создания вложенных объектов, где целое дерево объектов создается за один раз. Вот простой пример:

-2

Инициализаторы объектов также освобождают автора типа от написания большого количества шаблонов - все, что им нужно сделать, это написать некоторые свойства!

-3

Единственное большое ограничение сегодня заключается в том, что свойства должны быть изменяемыми, чтобы инициализаторы объектов работали: они функционируют, сначала вызывая конструктор объекта (в данном случае по умолчанию, без параметров), а затем присвоение свойств сеттерам.

Init-only свойства это исправят! Они вводят метод доступа init, который является вариантом метода доступа set, который может быть вызван только во время инициализации объекта:

-4

При таком объявлении приведенный выше клиентский код все еще допустим, но любое последующее присвоение свойств FirstName и LastName вызовет ошибку.

Init аксессоры и поля только для чтения

Поскольку init аксессоры могут быть вызваны только во время инициализации, им разрешено изменять поля readonly внутри класса, так же, как можно сделать в конструкторе.

-5

Records

Init-only свойства отлично подходят, если вы хотите сделать отдельные свойства неизменяемыми. Но если вы хотите, чтобы весь объект был неизменным и вел себя как значение, то вам следует рассмотреть возможность объявления его как record:

-6

Ключевое слово data в объявлении класса помечает его как запись. Это наделяет его несколькими дополнительными value-like поведениями, которые мы рассмотрим в второй части. Вообще говоря, записи должны рассматриваться скорее как “values” – data! – а не как объекты. Они не предназначены для изменяемого инкапсулированного состояния. Вместо этого вы представляете изменения во времени, создавая новые записи, представляющие новое состояние. Они определяются не своей идентичностью, а своим содержанием.