困惑于自动属性IL访问两个参数而不是一个

时间:2014-02-04 20:12:37

标签: .net .net-4.5 il ildasm

给出以下自动属性:

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的调用引起了我的注意,因为我在方法签名中看不到第二个参数。

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

1 个答案:

答案 0 :(得分:5)

  • ldarg.0加载隐藏的this参数。
  • ldarg.1加载value
  • stfld将堆栈顶部的值分配给堆栈下面的对象中的字段。