C言語でおなじみの「switch」はILにもあります。
ILのswitchは少し癖があります。それは「0からの連番へのジャンプテーブルである」というところです。とりあえず、ソースコードと、ヘクサエディタでの解析結果を見てください。
.assembly extern mscorlib{}
.assembly switch_test{}
.method public static void main() cil managed
{
.entrypoint
.maxstack 1
ldc.i4.0
switch(
_main_Zero,
_main_One,
_main_Two)
//どれにも当てはまらない場合は分岐しないのでここに来る。
ldstr "むむむ?"
br.s _main_fin
_main_Zero:
ldstr "零"
br.s _main_fin
_main_One:
ldstr "弐"
br.s _main_fin
_main_Two:
ldstr "に"
br.s _main_fin
//全てここに来る
_main_fin:
call void [mscorlib]System.Console::WriteLine(string)
ret
}
解析結果は以下のようになりました。
| 16 | ldc.i4.0 |
| 45 | switch |
| 03 00 00 00 | 3個の分岐がある |
| 07 00 00 00 | 「0」の時の分岐 |
| 0E 00 00 00 | 「1」の時の分岐 |
| 15 00 00 00 | 「2」の時の分岐 |
| 72 01 00 00 70 | ldstr どれにも該当しなかったとき |
| 2B 15 | br.s |
| 72 0B 00 00 70 | ldstr 0の時 |
| 2B 0E | br.s |
| 72 0F 00 00 70 | ldstr 1の時 |
| 2B 07 | br.s |
| 72 13 00 00 70 | ldstr 2の時 |
| 2B 00 | br.s |
| 28 01 00 00 0A | call 出力 |
| 2A | ret |
なかなかに素晴らしいものです。テーブルであることがよく分かります。しかも、int32型でのジャンプ範囲指定です。
特徴としては、前後どちらの方向にもジャンプできます。ですが、C#などほどの手軽さは無いですね。でも、動作は速そうな気がします。