Говорят, что разница между readonly и const заключается в том, что const - это время компиляции (while readonly - время выполнения). Но что именно это означает? Тот факт, что он компилирует время? Все компилируется в байтовый код, не так ли?
Что означает время компиляции "const"?
Ответ 1
Это означает, что каждый экземпляр элемента, помеченного как const
, будет заменен его значением во время компиляции, тогда как члены readonly будут разрешены во время выполнения.
Ответ 2
Это означает, что константные переменные записываются в местоположение, на которое они ссылаются. Итак, скажем, у вас есть 2 библиотеки, одна с переменной const
:
// Library A
const int TEST = 1;
// Library B
void m ()
{
Console.WriteLine(A.TEST);
}
Переменная на самом деле записывается во время компиляции в B. Разница в том, что если вы перекомпилируете A, но не B, B будет иметь "старое" значение. Это не произойдет с переменными readonly
.
Ответ 3
Хотя ответ, который предоставил Хулио, справедлив из-за влияния установки переменной как константы или чтения, между этими двумя объявлениями существует большая разница.
В то время как многие люди просто заявляют очевидное, что значение константы разрешено в компиляциях, тогда как значение только для чтения будет разрешено только во время выполнения, основная точка находится там, где ссылка не работает.
В зависимости от типа данных константы он будет либо заменен при вызове команды, либо сохранен в HEAP
и указан указателем.
Например, код:
const int x = 3;
int y = 3 * x;
может быть разрешено во время компиляции просто:
int y = 3 * 3;
С другой стороны, поле только для чтения всегда, хранящееся в STACK
и ссылающееся на указатель.
Ответ 4
A const может быть определен только во время его объявления. Чтение может быть определено во время его объявления или в конструкторе. Таким образом, переменная readonly может иметь разные значения в соответствии с конструктором, используемым для ее инициализации.
Ответ 5
Как правило, "константа времени компиляции" будет ссылаться на константное значение литерала, которое будет решать компилятор. Код, который генерирует компилятор, будет иметь значение constnat, доступное как непосредственный операнд, вместо того, чтобы загружать его из памяти.
Ответ 6
Одним из последствий того, что const является время компиляции, является то, что изменения в const в одной сборке не получают автоматически другие сборки без их перекомпиляции.
Например:
- Сборка A имеет открытый const int = 10
- Сборка B относится к этой константе.
- Оба скомпилированы. Теперь сборка A const изменено на 20, перераспределено.
- Сборка B не перекомпилирована.
Во время выполнения сборка B считает, что значение const равно 10, а не 20.
Если он был только для чтения, он получит новое значение.