Ответ 1
Они используются компилятором С#, когда он записывает файл .pdb для вашей программы. Что содержит информацию об отладке, которая включает в себя информацию о файле + номер строки для вашего кода. Отладчик использует это, чтобы найти машинный код, где ему нужно ввести инструкцию INT 3
, чтобы программа перестала выполняться при установке точки останова. Джиттер испускает команду кодового кода NOP для каждого Opcodes.Nop в MSIL.
Первый nop используется, когда вы устанавливаете точку останова на public Test()
. Обратите внимание, что он вводится после вызова базового конструктора, чтобы эта переменная стала действительной в окнах отладки Auto/Locals/Watch.
Второй nop используется, когда вы устанавливаете точку останова на первой {фигурной скобке. Эта строка не генерирует никакого кода, поэтому существует жесткая потребность в поддельной инструкции MSIL.
Та же история для третьего nop, сгенерированного для последней} фигурной скобки. Когда вы устанавливаете точку останова на этом, вы можете проверить возвращаемое значение метода (если есть). Видимый косвенно в окне Debug + Windows + Registers. Улучшено в VS2013.
Таким образом, это просто помогает отлаживать вашу программу, они делают контрольные точки предсказуемыми. Эти NOP не генерируются при создании конфигурации Release вашей программы. Одна из серьезных причин, почему проект С# имеет конфигурацию Debug и Release. Вы все еще можете отлаживать сборку Release, но это довольно неприятный опыт, который заставляет вас сомневаться в своем здравом рассудке:)