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

.net 对自动属性IL访问两个参数而不是一个参数感到困惑,.net,.net-4.5,il,ildasm,.net,.net 4.5,Il,Ildasm,给定以下自动属性: 公共字符串名称{get;set;} 我使用ILDASM分析了它的IL,并对结果感到好奇: .method public hidebysig specialname instance void set_Name(string 'value') cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.c

给定以下自动属性:

公共字符串名称{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
.method public hidebysing specialname实例void
设置cil管理的\u名称(字符串“值”)
{
.custom instance void[mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()=(01 00)
//代码大小8(0x8)
.maxstack 8
IL_0000:ldarg.0
IL_0001:ldarg.1
IL_0002:stfld字符串。人物::'k_BackingField'
IL_0007:ret
}//方法结束Person::set_Name
我可以看到该方法接受了一个名为
value
的参数,该参数对应于调用
ldarg.0
。但是,调用
ldarg.1
时我被抓住了,因为我在方法签名中看不到第二个参数

希望有人能解释一下这里发生了什么
  • ldarg.0
    加载隐藏的
    参数
  • ldarg.1
    load
    value
  • stfld
    将堆栈顶部的值指定给堆栈上其下方对象中的字段
      • ldarg.0
        加载隐藏的
        参数
      • ldarg.1
        load
        value
      • stfld
        将堆栈顶部的值指定给堆栈上其下方对象中的字段

      我对IL不太了解,但由于它是一个实例属性,它不也需要一个“this pointer”吗?实例成员总是有一个额外的隐藏参数。它传递了这个。我对IL不太了解,但因为它是一个实例属性,它不也需要一个“this指针”吗?实例成员总是有一个额外的隐藏参数。它通过了这个。