Как можно увидеть код С# после компиляции/оптимизации?

Я читал о ключе yield, когда я наткнулся на образец главы из С# в глубину: http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx.

В первом блоке кода используется ключевое слово yield для создания простого итератора. Но второй блок кода показывает этот код после того, как у компилятора был свой путь. Помимо прочего, он взорвал оператор yield в конечный автомат.

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

Мой вопрос: Действительно ли автор мог получить доступ к коду после компиляции или сделал вывод о том, как он будет выглядеть?

Ответ 1

Вы можете посмотреть с помощью Reflector, что, вероятно, лучше всего:

http://reflector.red-gate.com

Ответ 2

Сам автор упомянул:

Очевидно, что компилятор фактически не создает С#, но я использовал Reflector для декомпиляции кода как С#.

в том же параграфе, под названием Обзор высокого уровня: какой шаблон?

Ответ 3

Возможно оба. Сложно скомпилировать собранные сборки с помощью Reflector. И спецификация языка С#, которая определяет, как скомпилированы различные синтаксически-слащавые вещи, является общедоступным документом. Автор мог использовать либо подход, либо смесь двух.

Ответ 4

Посмотрите ildasm, чтобы посмотреть на скомпилированный IL.

(Действительно, это весело, когда вы попадаете в глаза)

Ответ 5

.NET CLR на самом деле имеет форму сборки, называемую MSIL, а также ассемблер и дизассемблер. Итак, да, вы можете скомпилировать код, а затем просмотреть точные скомпилированные инструкции CLR.

http://www.4guysfromrolla.com/articles/080404-1.aspx