给出以下自动属性:
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
的调用引起了我的注意,因为我在方法签名中看不到第二个参数。
希望有人能解释一下这里发生了什么吗?
答案 0 :(得分:5)
ldarg.0
加载隐藏的this
参数。ldarg.1
加载value
stfld
将堆栈顶部的值分配给堆栈下面的对象中的字段。