2014-11-26 3 views
1

У меня есть простой способ в C#, который получает доступ только для чтения поля:MSIL код для доступа только для чтения результатов на местах в ldarg.0

IL_0024: ldarg.0 
IL_0025: ldfld  string MyAssembly.MyClass.TestClass::A 

Моего естественное предположения было то, что это используется для загрузки «это» ссылки при доступе к полям-членам, и этот вопрос также подтверждает, что: Why do I have to do ldarg.0 before calling a field in MSIL?

Однако в документации для ldarg упоминается, что он используется для загрузки параметров, переданных методу.

Какое правильное объяснение этому поведение? и как можно различать загрузку «этой» справки и загрузку первого формального параметра в метод в IL?

ответ

4

Оба является правильным :)

Значение this передаются в качестве первого «невидимого» параметра методов экземпляра, поэтому в методе экземпляра, ldarg.0 является «загрузить значение this».

Вы можете видеть разницу, если вы пишете метод, который использует параметр , отличный от. Например:

static void StaticMethod(int x) 
{ 
    // This uses ldarg.0 
    Console.WriteLine(x); 
} 

void InstanceMethod(int x) 
{ 
    // This uses ldarg.1 
    Console.WriteLine(x); 
} 

и как можно отличить загрузки «это» ссылки и загрузки первого формальный параметр к способу в IL?

Проверив выше, в основном - если это метод экземпляра, то ldarg.0 загружает неявный this значение. В противном случае он загружает первое формальное значение параметра.

1

Все методы экземпляра принимают первый параметр как сам экземпляр класса. Это делается неявно, поэтому вам не нужно передавать его, когда вы вызываете метод.

Учитывая, что this является параметром метода, вам необходимо использовать ldarg.0 для толкания экземпляра this в стек оценки.