Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Скрытая ссылка this

Скрытая ссылка this

Обратите внимание на то, что в рамках программного кода CIL для ссылок на два входных аргумента (а и b) используются их индексы позиции (индекс 0 и индекс 1, поскольку индексация в виртуальном стеке выполнения начинается с нуля).

При анализе программного кода и его создании непосредственно в CIL следует быть очень внимательным, поскольку каждый (нестатический) метод, имеющий входные аргументы, автоматически получает неявный дополнительный параметр, который является ссылкой на текущий объект (это должно вызвать аналогию с ключевым словом C# this). Поэтому, если определить метод Add(), как нестатический

// Уже не является статическим!
public int Add(int a, int b) {
 return a + b;
}

то входные аргументы а и b будут загружаться с помощью ldarg.1 и ldarg.2 (а не с помощью ожидаемых ldarg.0 и ldarg.1). Причина как раз в том, что ячейка 0 будет содержать неявную ссылку this. Рассмотрите следующий псевдокод.

// Это только псевдокод!
.method public hidebysig static int32 AddTwoIntParams(MyClass_HiddenThisPointer this, int32 a, int32 b) cil managed {
 ldarg.0 // Загрузка MyClass_HiddenThisPointer в стек,
 ldarg.1 // Загрузка 'а' в стек.
 ldarg.2 // Загрузка 'b' в стек.
 …
}

Оглавление книги


Генерация: 2.730. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз