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