Вы задали там пять вопросов. Я отвечу на первый:
Наличие всех полей только для чтения в классе не обязательно делает экземпляр этого класса неизменным, поскольку существуют «способы» изменить значения полей только для чтения даже после создания. Как?
Можно ли изменить поле только для чтения после создания?
Да, , если вам достаточно доверия, чтобы нарушить правила «только для чтения» .
Как это работает?
Каждый бит пользовательской памяти в вашем процессе является изменяемым. Условные обозначения, такие как поля только для чтения, могут привести к тому, что некоторые биты будут выглядеть неизменяемыми, но если вы попытаетесь достаточно усердно, вы можете их изменить. Например, вы можете взять экземпляр неизменяемого объекта, получить его адрес и напрямую изменить необработанные биты. Для этого может потребоваться большая хитрость и знание внутренних деталей реализации диспетчера памяти, но каким-то образом диспетчеру памяти удается изменить эту память, так что вы тоже можете, если попытаетесь достаточно усердно. Вы также можете использовать «личное отражение», чтобы сломать различные части системы безопасности, если вам достаточно доверяют.
По определению, Полностью доверенному коду разрешено нарушать правила системы безопасности . Вот что означает «полностью доверенный». Если ваш полностью доверяющий код решает использовать такие инструменты, как частное отражение или небезопасный код, чтобы нарушить правила безопасности памяти, это разрешается делать полностью доверяемым кодом.
Пожалуйста, не надо. Это опасно и запутанно. Система безопасности памяти разработана, чтобы облегчить рассуждения о правильности вашего кода; умышленное нарушение его правил - плохая идея.
Итак, "только для чтения" ложь? Ну, предположим, я сказал вам, что , если все подчиняются правилам , каждый получает один кусочек торта. Является ли торт ложью? Эта претензия не претензия "вы получите кусок пирога". Это утверждение, что , если все подчиняются правилам , вы получите кусочек торта. Если кто-то обманывает и берет ваш кусок, для вас нет пирога.
Является ли поле чтения только для чтения только для чтения? Да, но , только если все подчиняются правилам . Таким образом, поля только для чтения не являются «ложью». Контракт заключается в том, что если все подчиняются правилам системы, то поле считается доступным только для чтения. Если кто-то нарушает правила, то, возможно, это не так. Это не делает утверждение «если все подчиняются правилам, поле только для чтения» - ложь!
Вопрос, который вы не задавали, но, возможно, должен был задать, заключается в том, является ли «только чтение» для полей структуры также «ложью». См. Работает ли использование открытых полей только для чтения для неизменяемых структур? для некоторых мыслей по этому вопросу. Поля только для чтения в структуре - это больше ложь, чем поля только для чтения в классе.
Что касается остальных ваших вопросов - я думаю, вы получите лучшие результаты, если зададите один вопрос на вопрос, а не пять вопросов на вопрос.