Re[31]: Welcome to C# 9.0
От: artelk  
Дата: 17.09.20 12:34
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, artelk, Вы писали:


A>>На сколько понимаю, init — это compiletime сущность, для рантайма он работает как обычный set, нет?

НС>Нет. init добавляет модификатор readonly на backing field
А мог бы и не добавлять, например.

A>>Десериализаторы используют рефлексию, они и не заметят, что там init вместо set.

НС>Нормальные десериализаторы используют кодогенерацию и она совершенно точно обломается на readonly полях.

Т.е. когда в язык вводили init-only свойства вопрос "а как же десериализаторы" отметался, а когда вводили рекорды он вдруг стал актуальным, так что-ли?
Напомню: обе фичи добавляются в язык одновременно.
Если уж начали делать кодогенерацию, то проблему десериализаторов (и более общую) могли бы, например, решить классическим образом: сгенерировать вложенный класс Builder, в котором все свойства имеют сеттер. Десериализацию будет нужно делать в него и потом из него получать инстанс рекорда. Популярные десериализаторы уже в следующих версиях позволят пропускать этот шаг.
Другой вариант: не ставить readonly на backing field.

П.С. Кстати, на сколько помню SRE игнорирует readonly на полях (не проверял на новых версиях .Net.)
Отредактировано 17.09.2020 12:47 artelk . Предыдущая версия . Еще …
Отредактировано 17.09.2020 12:46 artelk . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.