.NET IL属性设置器

时间:2010-11-15 13:21:30

标签: .net intermediate-language

考虑这个课程:

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

1 个答案:

答案 0 :(得分:4)

对于二传手:

任何实例成员都有一个隐含的“this”参数 - 基本上就是正在加载的内容。尝试将其转换为静态属性,你会看到它消失。

对于getter,我不确定为什么还有本地变量...调试器支持?当然在优化模式下编译它(从命令行/o+ /debug-)摆脱局部变量。