考虑这个课程:
public class Foo
{
// Fields
private string _bar;
// Properties
private string Bar
{
get
{
return this._bar;
}
set
{
this._bar = value;
}
}
}
现在我去查看编译器为Bar
属性的setter发出的IL代码:
.method private hidebysig specialname instance void set_Bar(string 'value') cil managed
{
.maxstack 8
L_0000: nop
L_0001: ldarg.0
L_0002: ldarg.1
L_0003: stfld string ConsoleApplication2.Program/Foo::_bar
L_0008: ret
}
为什么会ldarg.0
?什么位于第一个(索引0)参数?由于方法/属性设置器只接受1个参数...
吸气剂也是如此:
.method private hidebysig specialname instance string get_Bar() cil managed
{
.maxstack 1
.locals init (
[0] string CS$1$0000)
L_0000: nop
L_0001: ldarg.0
L_0002: ldfld string ConsoleApplication2.Program/Foo::_bar
L_0007: stloc.0
L_0008: br.s L_000a
L_000a: ldloc.0
L_000b: ret
}
为什么.locals init
?为什么ldarg.0?为什么不进行支持字段ldfld
并返回呢? :)
感谢。
-Snake
答案 0 :(得分:4)
对于二传手:
任何实例成员都有一个隐含的“this”参数 - 基本上就是正在加载的内容。尝试将其转换为静态属性,你会看到它消失。
对于getter,我不确定为什么还有本地变量...调试器支持?当然在优化模式下编译它(从命令行/o+ /debug-
)摆脱局部变量。