15

Привет всем! В C# есть const и readonly. В сети нашел только информацию о разнице static readonly и const. А какая разница между просто readonly и const?

Alerr
  • 2,606
  • Плохо искали: http://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and-readonly – Nikita Apr 08 '17 at 19:19
  • Если проще ответ вверху, то readonly можно менять в конструкторе – Владимир Apr 14 '19 at 07:25

1 Answers1

23

Значения полей с модификатором const при компиляции подставляются в тех местах кода, где к ним происходит обращение. Это значит, что в случае, когда такое поле объявлено в классе одной сборки, а используется классами другой сборки, для того чтобы измененное значение было применено в зависимой сборке, потребуется перекомпиляция зависимой сборки. Задать значение можно только в момент объявления. В общем то const-поля это не совсем поля.

Поля с модификатором readonly являются полноценными полями, с той разницей, что изменять их значение разрешено только в конструкторе. Соответственно static readonly - в статическом конструкторе (код инициализации полей при объявлении переносится в конструктор компилятором). Таким образом, значения readonly-полей могут, например вычисляться на основе параметров переданных в конструктор, что невозможно для const-полей.

В большинстве случаев рекомендуется использовать именно readonly-поля вместо const-полей когда ваш проект включает более одного модуля.

А еще у нас тут есть шикарный список литературы рекомендуемой к прочтению для изучения C# и .NET. Книги в списке условно разделены по уровню сложности. Большую часть из них можно найти в сети в электронном виде, было бы желание. Так уж получается, что без чтения книжек программисту не обойтись.

rdorn
  • 16,323
  • Спасибо за развернутый ответ. Можете показать как переопределить статический конструктор (я хотел бы детальнее посмотреть как оно работает)? – Alerr Apr 08 '17 at 20:17
  • @Alerr не понял, зачем его переопределять, он не наследуется, он просто создается компилятором если вы его не создали сами. А если создали, то помещает в его начало код инциализации статических полей. – rdorn Apr 08 '17 at 20:19
  • посоветуйте книжку по C#, которую считаете адекватной – Alerr Apr 08 '17 at 20:25
  • 2
    @Alerr собственно из предложенного списка Тролсен, затем Рихтер, а дальше уже сами поймете чего не хватает, но это лично мое мнение. – rdorn Apr 08 '17 at 20:27
  • @Alerr из Тролсена обязательны первые 4 части, остальное по желанию и необходимости, после этого можно переключаться на Рихтера. Рихтера целиком с компилятором под руками от корки до корки =) – rdorn Apr 08 '17 at 20:36