IL にコンパイルされると、if
ステートメントはどのように見えますか?
これは、C# の非常に単純な構造です。誰かがそれが実際に何であるかのより抽象的な定義を私に与えることができますか?
IL にコンパイルされると、if
ステートメントはどのように見えますか?
これは、C# の非常に単純な構造です。誰かがそれが実際に何であるかのより抽象的な定義を私に与えることができますか?
ここにいくつかのif
ステートメントとそれらがILにどのように変換されるかを示します。
ldc.i4.s 0x2f var i = 47;
stloc.0
ldloc.0 if (i == 47)
ldc.i4.s 0x2f
bne.un.s L_0012
ldstr "forty-seven!" Console.WriteLine("forty-seven!");
call Console::WriteLine
L_0012:
ldloc.0 if (i > 0)
ldc.i4.0
ble.s L_0020
ldstr "greater than zero!" Console.WriteLine("greater than zero!");
call Console::WriteLine
L_0020:
ldloc.0 bool b = (i != 0);
ldc.i4.0
ceq
ldc.i4.0
ceq
stloc.1
ldloc.1 if (b)
brfalse.s L_0035
ldstr "boolean true!" Console.WriteLine("boolean true!");
call Console::WriteLine
L_0035:
ret
ここで注意すべきことの1つは、IL命令は常に「反対」です。これは、「もしそうなら、ブロックの本体を飛び越えるif (i > 0)
」という意味の効果的な意味になります。i <= 0
if
スタックの最上位の値に応じてターゲット命令にジャンプする分岐命令が使用されます。
brfalse Branch to target if value is zero (false)
brtrue Branch to target if value is non-zero (true)
beq Branch to target if equal
bge Branch to target if greater than or equal to
bgt Branch to target if greater than
ble Branch to target if less than or equal to
blt Branch to target if less than
bne.un Branch to target if unequal or unordered
簡単な例:
ldloc.1 // loads first local variable to stack
ldc.i4.0 // loads constant 0 to stack
beq // branch if equal
これは次のようになります。
if(i == 0) //if i is the first local variable
条件分岐を含め、他の if は異なります。これは 1 回の投稿で説明するには多すぎます。IL-Code の紹介を探したほうがよいでしょう。
これに関するcodeprojectに関する素晴らしい記事があります。