سؤال

ماذا تفعل if يبدو أن البيان يبدو عندما يتم تجميعه في IL؟

إنه بناء بسيط للغاية في C#. هل يمكن أن يعطيني Sombody تعريفًا أكثر تجريدية لما هو عليه حقًا؟

هل كانت مفيدة؟

المحلول

وهنا عدد قليل 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

شيء واحد يجب ملاحظته هنا: تعليمات 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

ذلك يعتمد على حالة if. على سبيل المثال إذا كنت تقوم بالتحقق من مرجع ضد null سوف ينبعث المترجم أ brfalse التعليمات (أو أ brtrue اعتمادا على ما كتبته).

ال فِعلي if ستختلف الحالة بناءً على الحالة نفسها ولكن مثل dissasembler ILDASM أو سيكون العاكس أداة أفضل لمعرفة المزيد.

مثال بسيط:

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

سوف تختلف IFS الأخرى ، بما في ذلك الفروع الشرطية. هذا حقًا أكثر من اللازم لشرحه في منشور واحد ، فمن الأفضل أن تبحث عن مقدمة لـ IL-Code.

هناك مقالة لطيفة عن CodeProject بخصوص هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top