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#などほどの手軽さは無いですね。でも、動作は速そうな気がします。