Читать книгу 📗 "Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю"
}Первым шагом при размещении локальных переменных с помощью CIL является применение директивы
.localsinitОтображение параметров на локальные переменные в CIL
Вы уже видели, каким образом объявляются локальные переменные в CIL с применением директивы
.locals initpublic static int Add(int a, int b){ return a + b;}Такой с виду невинный метод требует немалого объема кодирования на языке CIL. Во-первых, входные аргументы (
аbldargaddretildasm.exe.method public hidebysig static int32 Add(int32 a, int32 b) cil managed{ .maxstack 2 ldarg.0 // Загрузить а в стек. ldarg.1 // Загрузить b в стек. add // Сложить оба значения. ret}Скрытая ссылка this
Обратите внимание, что ссылка на два входных аргумента (
аb01Во время исследования или написания кода CIL нужно помнить о том, что каждый нестатический метод, принимающий входные аргументы, автоматически получает неявный дополнительный параметр, который представляет собой ссылку на текущий объект (подобно ключевому слову
thisAdd()<b>// Больше не является статическим!</b>public int Add(int a, int b){ return a + b;}то входные аргументы
аbldarg.1ldarg.2ldarg.0ldarg.1this<b>// Это ТОЛЬКО псевдокод!</b>.method public hidebysig static int32 AddTwoIntParams( MyClass_HiddenThisPointer this, int32 a, int32 b) cil managed{ ldarg.0 // Load MyClass_HiddenThisPointer onto the stack. ldarg.1 // Load "a" onto the stack. ldarg.2 // Load "b" onto the stack....}Представление итерационных конструкций в CIL
Итерационные конструкции в языке программирования C# реализуются посредством ключевых слов
forforeachwhiledofor:public static void CountToTen(){ for(int i = 0; i < 10; i++) { }}Вспомните, что для управления прекращением потока выполнения, когда удовлетворено некоторое условие, используются коды операций
brbrbltnforiiТакже вспомните, что в случае применения любого кода операции CIL, предназначенного для ветвления, должна быть определена специфичная метка кода (или две), обозначающая место, куда будет произведен переход при истинном результате оценки условия. С учетом всего сказанного рассмотрим показанный ниже (отредактированный) код CIL, который сгенерирован утилитой
ildasm.exe.method public hidebysig static void CountToTen() cil managed{ .maxstack 2 .locals init (int32 V_0, bool V_1) IL_0000: ldc.i4.0 // Загрузить это значение в стек.