.NET IL Установщик свойств

Рассмотрим этот класс:

public class Foo
{
    // Fields
    private string _bar;

    // Properties
    private string Bar
    {
        get
        {
            return this._bar;
        }
        set
        {
            this._bar = value;
        }
    }
}

Теперь, когда я иду и смотрю в коде IL, испускаемом компилятором для установки Bar имущество:

.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) аргументе? Поскольку метод / свойство setter принимает только 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 ответ

Решение

Для сеттера:

Любой член экземпляра имеет неявный параметр "this" - это то, что загружается, в основном. Попробуйте превратить его в статическое свойство, и вы увидите, что оно исчезнет.

Что касается геттера, я не уверен, почему существует локальная переменная... возможно, поддержка отладчика? Конечно, компилирование в оптимизированном режиме (/o+ /debug- из командной строки) избавляется от локальной переменной.

Другие вопросы по тегам