对自动属性 ​​IL 访问两个参数而不是一个参数感到困惑

Posted

技术标签:

【中文标题】对自动属性 ​​IL 访问两个参数而不是一个参数感到困惑【英文标题】:Confused about auto property IL accessing two arguments rather than one 【发布时间】:2014-03-01 00:11:08 【问题描述】:

给定以下自动属性:

public string Name get; set;

我使用 ILDASM 分析了它的 IL,并对结果感到好奇:

.method public hidebysig specialname instance void 
        set_Name(string 'value') cil managed

  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       8 (0x8)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  stfld      string Strings.Person::'<Name>k__BackingField'
  IL_0007:  ret
 // end of method Person::set_Name

我可以看到该方法接受了一个名为value的参数,它对应于调用ldarg.0。但是,对ldarg.1 的调用让我感到困惑,因为我在方法签名中看不到第二个参数。

希望有人能解释一下这里发生了什么吗?

【问题讨论】:

对IL不太了解,但既然是实例属性,难道也需要一个“this指针”吗? 实例成员总是有一个额外的隐藏参数。它通过了 this. 【参考方案1】: ldarg.0 加载隐藏的this 参数。 ldarg.1 加载 value stfld 将堆栈顶部的值分配给堆栈上它下方的对象中的字段。

【讨论】:

以上是关于对自动属性 ​​IL 访问两个参数而不是一个参数感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 使用存储过程时参数为空时的处理

使用IL DASM来查看接口内的自动属性

如何指定一个请求参数绑定到某个控制器方法参数而不是Spring MVC中的模型属性?

.NET学习:中间语言(IL)=托管代码?

Laravel如何在自动重定向验证后发送参数以查看

Javascript进阶---函数参数