.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-
из командной строки) избавляется от локальной переменной.