public static string foo(int num)
{
switch (num)
{
case 0:
return "result 1";
case 1:
return "result 2";
case 2:
return "result 3";
}
return "no result";
}
становится:
.method public hidebysig static string foo(int32 num) cil managed
{
// Code size 57 (0x39)
.maxstack 1
.locals init ([0] string CS$1$0000,
[1] int32 CS$4$0001)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: stloc.1
IL_0003: ldloc.1
IL_0004: switch (
IL_0017,
IL_001f,
IL_0027)
IL_0015: br.s IL_002f
IL_0017: ldstr "result 1"
IL_001c: stloc.0
IL_001d: br.s IL_0037
IL_001f: ldstr "result 2"
IL_0024: stloc.0
IL_0025: br.s IL_0037
IL_0027: ldstr "result 3"
IL_002c: stloc.0
IL_002d: br.s IL_0037
IL_002f: ldstr "no result"
IL_0034: stloc.0
IL_0035: br.s IL_0037
IL_0037: ldloc.0
IL_0038: ret
} // end of method Program::foo
Перемещение возврата в регистр по умолчанию:
.method public hidebysig static string foo(int32 num) cil managed
{
// Code size 57 (0x39)
.maxstack 1
.locals init ([0] string CS$1$0000,
[1] int32 CS$4$0001)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: stloc.1
IL_0003: ldloc.1
IL_0004: switch (
IL_0017,
IL_001f,
IL_0027)
IL_0015: br.s IL_002f
IL_0017: ldstr "result 1"
IL_001c: stloc.0
IL_001d: br.s IL_0037
IL_001f: ldstr "result 2"
IL_0024: stloc.0
IL_0025: br.s IL_0037
IL_0027: ldstr "result 3"
IL_002c: stloc.0
IL_002d: br.s IL_0037
IL_002f: ldstr "result 4"
IL_0034: stloc.0
IL_0035: br.s IL_0037
IL_0037: ldloc.0
IL_0038: ret
} // end of method Program::foo
Точно так же. Нет разницы в производительности. Я изменил «без результата» на результат 4, просто чтобы убедиться, что код был восстановлен. Очевидно, компилятор C # оптимизирует его или он просто оказывается эквивалентным.