Pull to refresh

Comments 6

Свойства не могут быть сделаны автоматическими, т.к. имена скрытых полей класса генерируются снова при каждой компиляции
Всегда называются как <ИмяСвойства>k__BackingField. Во всех известных компиляторах C#.
Если обратиться к четвертому изданию CLR via C#, то там явно говорится:
Do not use C#’s automatically implemented property feature to define properties inside types marked with the [Serializable] attribute, because the compiler generates the names of the fields and the generated names can be different each time that you recompile your code, preventing instances of your type from being deserializable.
Об этом всем твердят, но это использует слишком много народу, чтобы кто-то сломал бинарную совместимость. Так и живём. Вот имена анонимных типов — те отличаются у csc и gmcs, да.
(Не)ожиданно на консоль будет выведено false, а это значит, что мы получили два объекта-синглтона. Такой результат можно предвидеть, если вспомнить, что в процессе десериализации с помощью рефлексии вызывается приватный конструктор и все десериализуемые значения присваиваются новому объекту. Именно эта особенность синглтона кладет первый камень в наш сад: синглтон перестает быть синглтоном.
Неверно. BinaryFormatter использует FormatterServices.GetSafeUninitializedObject, который позволяет создать экземпляр объекта без вызова конструктора. Два разных экземпляра вы получили из-за того что статическое поле уже было проинициализировано в статическом конструкторе, а десериализатор создал свой экземпляр объекта.
Спасибо, что заметили, я действительно ошибся в этом месте. Сделал upd.
Иногда приходится городить огород, да. Но почему-то хочется взять какой-нибудь DI фреймворк и забыть о прочтенном, как о страшном сне…
Sign up to leave a comment.

Articles