2009-04-12 5 views
6

Я хочу знать все об yield заявление, в удобной для понимания форме.Внедрение отчета об уступке

Я прочитал инструкцию yield и ее легкость при реализации шаблона итератора. Однако большинство из них очень сухо. Я хотел бы получить под обложки и посмотреть, как Microsoft обрабатывает доход возврата.

Также, когда вы используете прерывание выхода?

+1

Вы не получаете как «все», так и «легко понять», извините! FYI, я опубликую серию статей в блогах о некоторых мыслях по этой функции с точки зрения дизайна и реализации языка, начиная с 2 июля. –

ответ

10

yield работы по созданию государственного автомата. Он сохраняет текущее состояние подпрограммы, когда он в следующий раз выходит из этого состояния и возобновляется с этого состояния.

Вы можете использовать рефлектор, чтобы увидеть, как он реализован компилятором.

yield break используется, когда вы хотите прекратить возвращать результаты. Если вы не имеете yield break, компилятор будет считать, один в конце функции (так же, как return; оператор в нормальной функции)

+0

Что это означает «текущее состояние подпрограммы»: значения регистра процессора, указатель кадра и т. Д.? – Guillaume07

+0

посмотреть [coroutines] (http://storm-enroute.com/coroutines/docs/0.6/101/) – Tcraft

+0

@Tcraft Каноническая реализация Microsoft не использует разные стеки/сегментированные стеки/и т. Д. Они используют объект, выделенный для кучи, для хранения состояния. –

5

Как говорит Mehrdad, он строит ул ел машина.

Как и с использованием Reflector (другое превосходное предложение), вы можете найти my article on iterator block implementation полезным. Это было бы относительно простыми, если бы не для finally блоков, - но они ввели совершенно дополнительное измерение сложности!