Помимо очевидной разницы
- необходимость объявить значение во время определения значений
const
VS readonly
может быть вычислена динамически, но ее необходимо назначить до выхода из конструктора .. после этого он будет заморожен.
- 'const's неявно
static
. Вы используете нотацию ClassName.ConstantName
для доступа к ним.
Есть небольшая разница. Рассмотрим класс, определенный в AssemblyA
.
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly int I_RO_VALUE;
public Const_V_Readonly()
{
I_RO_VALUE = 3;
}
}
AssemblyB
ссылается на AssemblyA
и использует эти значения в коде. Когда это скомпилировано,
- в случае значения
const
это похоже на поиск-замену, значение 2 «запекается» в IL AssemblyB
. Это означает, что если завтра я обновлю I_CONST_VALUE
до 20 в будущем. AssemblyB
будет еще 2, пока я не перекомпилирую .
- в случае значения
readonly
это похоже на ref
в ячейке памяти. Значение не заполняется в IL AssemblyB
. Это означает, что если ячейка памяти обновлена, AssemblyB
получает новое значение без перекомпиляции. Так что если I_RO_VALUE
обновлен до 30, вам нужно только построить AssemblyA
. Не требуется перекомпиляция всех клиентов.
Так что, если вы уверены, что значение константы не изменится, используйте const
.
public const int CM_IN_A_METER = 100;
Но если у вас есть константа, которая может измениться (например, с точной точностью) ... или, если сомневаетесь, используйте readonly
.
public readonly float PI = 3.14;
Обновление: Аку нужно получить упоминание, потому что он указал это первым. Также мне нужно подключить, где я это узнал .. Эффективный C # - Билл Вагнер