Как выполняются выражения?

Поскольку C# не является таким языком, как Python или Clojure, их можно оценить в REPL. Тогда как выражение, которое мы пишем в окне watch или в любом окне оценщиков, если уж на то пошло, выполняется на лету?

Это может быть очень очевидно, но я не мог понять.

Изменить: функции не являются первоклассными в C#. Всякий раз, когда мы прикрепляем точку останова, выполнение останавливается, и у нас есть текущий контекст из запущенного потока, и всякий раз, когда мы изменяем значение переменной, именно так оно обновляет значение в потоке/стеке. Я хотел бы понять, как выражение, которое я пишу в окне, выполняется внутри.

Например, простое выражение, подобное следующему,

2 == 2

Создает ли отладчик статический класс и статический метод для выполнения выражения? Чтобы запустить в CLR, его нужно скомпилировать, так как же это работает?

Спасибо за ваше время заранее. :)


person ganesan arunachalam    schedule 26.08.2019    source источник
comment
Выражения компилируются на лету при первом использовании.   -  person TheGeneral    schedule 26.08.2019


Ответы (1)


Когда вы запускаете приложение в режиме отладки, к вашему приложению подключается отладчик, который отслеживает текущее состояние приложения в режиме реального времени. Я сохраняю информацию о том, какое выражение в данный момент выполняется в каждом потоке, где переменные хранятся в памяти и т. д. Эта информация обновляется при каждом выполнении инструкции в скомпилированном коде (IL). Итак, когда выполнение приостановлено и вы выполняете какое-то выражение, например, вы меняете значение локальной переменной x. Итак, вы выполняете выражение, скажем, x = 5, в этот момент отладчик уже знает, где x хранится в стеке, поэтому он может скомпилировать наше выражение и «внедрить» его в текущий процесс.

person Giorgi Chkhikvadze    schedule 26.08.2019