Сообщение 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.
НС>Здравствуйте, 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.)
НС>Здравствуйте, artelk, Вы писали:
A>>На сколько понимаю, init — это compiletime сущность, для рантайма он работает как обычный set, нет?
НС>Нет. init добавляет модификатор readonly на backing field
А мог бы и не добавлять, например.
A>>Десериализаторы используют рефлексию, они и не заметят, что там init вместо set.
НС>Нормальные десериализаторы используют кодогенерацию и она совершенно точно обломается на readonly полях.
Т.е. когда в язык вводили init-only свойства вопрос "а как же десериализаторы" отметался, а когда вводили рекорды он вдруг стал актуальным, так что-ли?
Напомню: обе фичи добавляются в язык одновременно.
Если уж начали делать кодогенерацию, то проблему десериализаторов (и более общую) могли бы, например, решить классическим образом: сгенерировать вложенный класс Builder, в котором все свойства имеют сеттер. Десериализацию будет нужно делать в него и потом из него получать инстанс рекорда. Популярные десериализаторы уже в следующих версиях позволят пропускать этот шаг.
Другой вариант: не ставить readonly на backing field.
П.С. Кстати, на сколько помню SRE игнорирует readonly на backing field (не проверял на новых версиях .Net.)