Информация об изменениях

Сообщение Re[31]: Welcome to C# 9.0 от 17.09.2020 12:34

Изменено 17.09.2020 12:46 artelk

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

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


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

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

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

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

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

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


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

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

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

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

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

П.С. Кстати, на сколько помню SRE игнорирует readonly на backing field (не проверял на новых версиях .Net.)