C# 循环判断会进来几次的实现代码

2020-01-05 09:26:25于丽


public void BirmeruLerrayjairbay()
    {
      for (int i = 0; i < DaydrearNenawerlai(); i++)
      {
        Console.WriteLine("第" +i.ToString()+"个逗比");
      }
    }
    /// <summary>
    /// 进入lindexi.github.io可以看到更多博客
    /// </summary>
    /// <returns></returns>
    public static int DaydrearNenawerlai()
    {
      return 10;
    }

转 IL 可以看到下面代码,我会在 IL 添加很多注释,所以很容易看懂。


.method public hidebysig instance void 
  BirmeruLerrayjairbay() cil managed 
 {
  .maxstack 3
  .locals init (
   [0] int32 i
  )
  // 第 23 行 18 个字符到 27 个字符
  // [23 18 - 23 27]
  IL_0000: ldc.i4.0 
  // 定义 i ,代码的 int i = 0;  
  IL_0001: stloc.0   // i
  IL_0002: br.s     IL_0023
  // 这里就是进入循环 for ,在 IL 不管 for 还是 while 都是差不多
  // start of loop, entry point: IL_0023
   // [25 17 - 25 60]
   // 下面这个代码就是 Console.WriteLine("第" +i.ToString()+"个逗比"); 从代码可以看到
   // 需要先申请"第"
   IL_0004: ldstr    "第"
   // 然后把 i 放入栈
   IL_0009: ldloca.s   i
   // 调用 int.ToString ,使用的是实例的方法
   IL_000b: call     instance string [mscorlib]System.Int32::ToString()
   // 把"个逗比"放入栈
   IL_0010: ldstr    "个逗比"
   // 调用字符串组合方法,组合三个字符串,返回一个字符串。
   // 把刚才入栈三个字符串出栈,返回的字符串入栈
   IL_0015: call     string [mscorlib]System.String::Concat(string, string, string)
   // 调用 Console.WriteLine ,从栈拿到一个字符串输出
   IL_001a: call     void [mscorlib]System.Console::WriteLine(string)
   // 下面是 i++ 代码
   // [23 55 - 23 58]
   // 将指定索引处的局部变量加载到计算堆栈上,这里的索引是 0 ,在代码的变量是 i 所以把 i 加载到计算堆栈
   IL_001f: ldloc.0   // i
   // 将整数值 1 作为 int32 推送到计算堆栈上
   IL_0020: ldc.i4.1   
   // 从堆栈出栈两个数值进行相加,返回的值放在栈
   IL_0021: add     
   // 从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中,这里索引是 0 ,在代码的变量是 i ,所以 i = i + 1 的代码就是这样做
   IL_0022: stloc.0   // i
   // 从堆栈加载 i ,把 i 入栈
   // [23 29 - 23 53]
   IL_0023: ldloc.0   // i
   // 调用方法 DaydrearNenawerlai 拿到返回值
   IL_0024: call     int32 MuhoubearWhedoofi.MeepeMorcear::DaydrearNenawerlai()
   // 如果第一个值小于第二个值,则将控制转移到目标指令,这里的第一个值就是 i ,第二个值就是 DaydrearNenawerlai 的返回值。跳转到标签 IL_0004 ,如果没有小于,就继续代码。
   IL_0029: blt.s    IL_0004
  // end of loop
  // [27 9 - 27 10]
  IL_002b: ret     
 } // end of method MeepeMorcear::BirmeruLerrayjairbay
 .method public hidebysig static int32 
  DaydrearNenawerlai() cil managed 
 {
  .maxstack 8
  // 把一个值 放入堆栈,放入的是 10 ,然后从栈拿到值返回
  // [36 13 - 36 23]
  IL_0000: ldc.i4.s   10 // 0x0a
  IL_0002: ret     
 } // end of method MeepeMorcear::DaydrearNenawerlai