Да, есть несколько способов сделать это в C #.
Прежде всего, что такое "переменная"? Переменная является местом хранения. Локальные переменные, формальные параметры методов (и индексаторы, конструкторы и т. Д.), Статические поля и поля экземпляров, элементы массива и разыменования указателей являются переменными.
Некоторые переменные могут быть объявлены как «только для чтения». Переменная «только для чтения» может быть изменена только один раз, либо инициализатором в объявлении, либо в конструкторе. Только объявления полей могут быть только для чтения; C # не поддерживает объявленные пользователем локальные файлы только для чтения.
Существуют определенные ограничения на переменные только для чтения, которые помогают гарантировать, что нормальная работа C # не приводит к мутации. Это может привести к неожиданным результатам! См
http://ericlippert.com/2008/05/14/mutating-readonly-structs/
для деталей.
Некоторые местные жители также эффективно читаются. Например, когда вы говорите using(Stream s = whatever)
, то внутри встроенного оператора using
вы не можете изменить значение s. Причина этого ограничения состоит в том, чтобы предотвратить ошибку, при которой вы создаете ресурс, который должен быть удален, а затем утилизируете другой ресурс, когда содержимое переменной s удаляется. Лучше быть таким же.
(К сожалению, в C # есть ошибки, связанные с ситуацией, когда располагаемый ресурс является типом структуры, структура имеет метод, который изменяет структуру, а локальная переменная является или не является закрытой локальной для анонимной функции или блок итератора; поскольку сценарии неясны, а исправление может быть нарушено, мы еще ничего не предприняли, ожидая дальнейшего анализа.)
Локальная переменная, объявленная в операторе foreach
, также фактически readonly
- эта переменная меняет значение каждый раз в цикле, но вам не разрешено изменять ее значение.
Нет способа сделать разыменование только для формального параметра, элемента массива или указателя.
Существуют различные способы «снять» ограничение на чтение и запись в переменную, которая должна быть только для чтения. Вы можете использовать Reflection или небезопасный код, чтобы нарушить практически любое ограничение безопасности CLR, если у вас достаточно прав для этого. Если тебе больно, когда ты это делаешь, не делай этого; с этими полномочиями приходит ответственность знать, что ты делаешь, и делать это правильно.