对自动属性 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 访问两个参数而不是一个参数感到困惑的主要内容,如果未能解决你的问题,请参考以下文章