C#: разница между "const" и "static readonly"
Один из вопросов, о которы не задумываешся, пока не спросят...
Так какая же разница между этими переменными? А вот какая.
На высоком уровне, значения констант, заменяються своими значениями во время компиляции, в то время как значение "static readonly" поля определяеться в момент выполнения кода.
Это означает, что любая библиотека / сборка, у которых есть ссылки на "const" необходимо перекомпилировать если изменять константу. Изменение же статических переменных не потребует в дальнейшем перекомпиляции.Безусловный выигрыш статик полей.
"Static readonly" поля могут содержать ссылочные типы, в то время как константы только поддерживают чисельные типы, строки .NET string и null.
Варианты инициализации(updated):
class Foo
{
//инициализация при создании - норма.
// при чем не обязательно константой. Сейчас ложим результат вычислений
public static readonly int fooVal = Foo.getIntVal();//ok
// иннициализация в статическом конструкторе - тоже норма. Все ок.
static Foo()
{
fooVal = 12;//ok
}
public static int getIntVal()
{
return 12;
}
// стандартный конструктор - здесь уже возникнет проблема компиляции.
public Foo()
{
fooVal = 12;//fail
}
}
Можно сделать вывод, что "const" поля довольно негибки и если нужны какие либо динамические изменения в такого рода полях лучше использовать "Static readonly".