Недавно я копал в IL, и я заметил некоторое нечетное поведение компилятора С#. Следующий метод является очень простым и проверяемым приложением, он немедленно выйдет с кодом выхода 1:
static int Main(string[] args)
{
return 1;
}
Когда я компилирую это с помощью сообщества Visual Studio 2015, генерируется следующий код IL (добавлены комментарии):
.method private hidebysig static int32 Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init ([0] int32 V_0) // Local variable init
IL_0000: nop // Do nothing
IL_0001: ldc.i4.1 // Push '1' to stack
IL_0002: stloc.0 // Pop stack to local variable 0
IL_0003: br.s IL_0005 // Jump to next instruction
IL_0005: ldloc.0 // Load local variable 0 onto stack
IL_0006: ret // Return
}
Если бы я должен был передать этот метод, казалось бы, тот же результат можно было бы достичь со следующим IL:
.method static int32 Main()
{
.entrypoint
ldc.i4.1 // Push '1' to stack
ret // Return
}
Существуют ли основополагающие причины, по которым я не знаю, что это ожидаемое поведение?
Или просто, что собранный объектный код IL дополнительно оптимизирован по линии, поэтому компилятору С# не нужно беспокоиться об оптимизации?