По какой-то причине я всегда предполагал, что с полями readonly
связаны служебные данные, которые я считал CLR, отслеживая, было ли инициализировано поле readonly
или нет. Накладные расходы здесь были бы дополнительным использованием памяти для отслеживания состояния и проверки при назначении значения.
Возможно, я принял это, потому что я не знал, что поле readonly
может быть инициализировано только внутри конструктора или внутри самого объявления поля и без проверки времени выполнения, вы не сможете гарантировать, что это не будет назначается несколько раз различными способами. Но теперь я знаю это, это легко может быть статически проверено компилятором С#, не так ли? Так это дело?
Другая причина в том, что я читал, что использование readonly
имеет "незначительное" влияние на производительность, но они никогда не входили в это утверждение, и я не могу найти информацию по этому вопросу, поэтому мой вопрос. Я не знаю, какое другое влияние на производительность может быть в стороне от проверок времени выполнения.
Третья причина заключается в том, что я видел, что readonly
сохраняется в скомпилированном IL как initonly
, поэтому в чем причина того, что эта информация находится в IL, если readonly
является не чем иным, как гарантией С#, что поле никогда не назначается вне конструктора или объявления?
С другой стороны, я обнаружил, что вы можете установить значение readonly int
через отражение, если CLR не выбрасывает исключение, что не должно быть возможным, если readonly
была проверкой времени выполнения.
Итак, я предполагаю, что "readonlyness" - это только функция времени компиляции, может ли кто-нибудь подтвердить/опровергнуть это? И если это так, в чем причина включения этой информации в ИЛ?