Объявление переменной const также позволит компилятору выполнять оптимизацию - вместо того, чтобы выделять int в стеке и размещать там его значение, компилятор может просто использовать значение непосредственно с вашим кодом
т.е. следующее:
const int test = 4;
DoSomething(test);
Может быть скомпилировано как
DoSomething(4);
компилятором
Редактировать: Ответить на "постоянное распространение", поскольку поле для комментариев имеет ограничение размера
Использование ildasm для проверки между const и no const для выпуска с оптимизацией:
код
int test = 4;
Console.WriteLine(test*2);
Компилируется в
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 11 (0xb)
.maxstack 2
.locals init ([0] int32 test)
IL_0000: ldc.i4.4
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: ldc.i4.2
IL_0004: mul
IL_0005: call void [mscorlib]System.Console::WriteLine(int32)
IL_000a: ret
} // end of method Program::Main
В то время как
const int test = 4;
Console.WriteLine(test*2);
оптимизируется до
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldc.i4.8
IL_0001: call void [mscorlib]System.Console::WriteLine(int32)
IL_0006: ret
} // end of method Program::Main
Используется версия 2010 с оптимизацией.
Я выполнил поиск, чтобы узнать больше о постоянном распространении, и хотя это возможно, текущий компилятор не делает этого, как упоминалось здесь