繁体   English   中英

参考参数的 IL 差异

[英]Difference in IL for ref paramters

我试图了解在 IL 级别处理通过引用传递的参数和值的方式之间的区别。

下面是C#中的两种方法

    public static void TestRef(ref int x)
    {
        x++;
    }
    public static void Test(int x)
    {
        x++;
    }

下面是按值传递的 IL,我知道它加载了 arg,然后加载了 int 常量 1 并将其添加并塞回堆栈中。

  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldc.i4.1
  IL_0003:  add
  IL_0004:  starg.s    x
  IL_0006:  ret

通过引用传递的方法的 IL:

IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.0
  IL_0003:  ldind.i4
  IL_0004:  ldc.i4.1
  IL_0005:  add
  IL_0006:  stind.i4
  IL_0007:  ret

我不明白为什么有两个ldarg.0语句。 我假设 IL_0002/3 只是加载参数地址,然后加载该地址的参数值。

但是IL_0001呢? 这与x =x+1的左侧有关吗?

所加载地址IL_0001: ldarg.0将由存储操作在被消耗IL_0006: stind.i4

msdn 告诉我们有关stind.i4操作码的信息:

按顺序排列的堆栈过渡行为是:

  1. 地址被压入堆栈。

  2. 一个值被压入堆栈。

  3. 从堆栈中弹出值和地址; 该值存储在地址中。

https://docs.microsoft.com/de-de/dotnet/api/system.reflection.emit.opcodes.stind_i4?view=netframework-4.8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM