рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ:
рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореЗрд░реЗ рдХрдо рдЕрдиреБрднрд╡реА рд╕рд╣рдХрд░реНрдореА рдиреЗ рдореБрдЭрд╕реЗ рдкреВрдЫрд╛ рдерд╛ рдХрд┐ C # рдХреЗ рд▓рд┐рдП рдкреИрджрд╛рд╡рд╛рд░ рд╡рд╛рдкрд╕реА рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдмрд╣реБрдд рдмрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╢рдмреНрджреЛрдВ рдкрд░ рд╕рдВрджреЗрд╣ рдХрд┐рдпрд╛ред MSDN рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЬреЛ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдордЬрдмреВрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдПрдХ рд╕рд╡рд╛рд▓ рдерд╛: "рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдХреНрдпрд╛ рд╣реИ?" "ред рд▓реЗрдЦ рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд░реВрд╕реА-рднрд╛рд╖рд╛ рдХреЗ рд▓реЗрдЦреЛрдВ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:
C # рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
(рднрд╛рдЧ 2)рдЕрдирд╛рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддрд░рд╣, C # рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдБ рдЬрдЯрд┐рд▓ рд╕рдВрд╢реНрд▓рд┐рд╖реНрдЯ рд╢рд░реНрдХрд░рд╛ рд╣реИрдВред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕реА # рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдерд╛), рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдкреАрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЙрдкрдЬ рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (рдФрд░ рд╕рдВрднрд╡рддрдГ рдмреНрд░реЗрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди) рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдпреАрд▓реНрдб рд░рд┐рдЯрд░реНрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдмрдЪ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЬрдм рдЕрдЧрд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЗрдЯреНрд░реЗрдЯрд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдерд┐рддрд┐ рдмрд╣рд╛рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рд╕реНрдерд╛рдиреАрдп рдЗрдЯрд░реЗрдЯрд░ рдЪрд░ (рдкреНрд░реА-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬреНрдб рд▓реЛрдХрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдЯрд░реЗрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░, рдЬрд┐рд╕рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдЪрд░ (рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдХреНрд╖реЗрддреНрд░) рдмрди рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕ рдЯреНрд░реИрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдирд┐рд╖реНрдкрд╛рджрди рдмрд╛рдзрд┐рдд рд╣реБрдЖ рдерд╛, рдФрд░ рд╡рд░реНрддрдорд╛рди рдХреНрд╖реЗрддреНрд░, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
class MyClass { int limit = 0; public MyClass(int limit) { this.limit = limit; } public IEnumerable<int> CountFrom(int start) { for (int i = start; i <= limit; i++) yield return i; } }
рдХрд╛рдЙрдВрдЯрдлреНрд░реЙрдо рд╡рд┐рдзрд┐ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рдмрдирд╛рддреА рд╣реИ рдЬреЛ рд╕реНрдЯреЗрдк 1 рд╕реЗ рд╢реБрд░реБрдЖрдд рд╕реЗ рд▓реЗрдХрд░ рд╕реАрдорд╛ рддрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдмрдирд╛рддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдЗрд╕ рдЧрдгрдирд╛рдХрд░реНрддрд╛ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ:
class MyClass_Enumerator : IEnumerable<int> { int state$0 = 0;
рд╕рдВрдзрд╛рд░рд┐рддреНрд░ рд╡рд░реНрдЧ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рд░рд╛рдЬреНрдп рдФрд░ рд╡рд░реНрддрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реАрд▓реНрдбред рд╡рд░реНрддрдорд╛рди рд╕рдВрдкрддреНрддрд┐ рдмрд╕ рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХреЛ рд▓реМрдЯрд╛рддреА рд╣реИред рд╕рднреА рдЕрд╕рд▓реА рдХрд╛рдо MoveNext рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
MoveNext рд╡рд┐рдзрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдХрдИ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИ:
- рд╕рднреА рдЪрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдпрд╣ рдпрд╣ $ 0 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЙрддреНрдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рдпрд╣ рдореВрд▓ рдХреЗ рдмрдЬрд╛рдп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
- m рдпрд╣ $ 0.m рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ m рдореВрд▓ рд╡рд░реНрдЧ (рдЧреИрд░-рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░, рд╕рдВрдкрддреНрддрд┐ рдпрд╛ рд╡рд┐рдзрд┐) рдХрд╛ рд╕рджрд╕реНрдп рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдирд┐рдпрдо рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕рдВрдпреБрдХреНрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд╕рд░реНрдЧ m рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛ рдирд╛рдо рд▓рд┐рдЦрдирд╛ рдЗрд╕ рджрд┐рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЖрд╢реБрд▓рд┐рдкрд┐ рд╣реИред
- v рдпрд╣ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ v рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╣реИред рдпрд╣ рдирд┐рдпрдо рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ v рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЗрд╕ред tantamount рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЖрдк рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдВрдЧреНрд░рд╣рдг рдмрджрд▓ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╕рднреА рдпреАрд▓реНрдб рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдЬ рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
current$0 = x; state$0 = n; return true; resume$n:;
рдЬрд╣рд╛рдБ n рдПрдХ рд╕реЗ рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдкрдЬ рдмреНрд░реЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдЬ рдмреНрд░реЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ
state$0 = n2; return false;
рдЬрд╣рд╛рдБ n2 рдЙрдкрдЬ рд╡рд╛рдкрд╕реА рдХреЗ рднрд╛рд╡реЛрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд░рд╛рдЬреНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЙрдкрдЬ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдмрдбрд╝реЗ рд╕реНрдЯреЗрдЯ рдореИрдиреЗрдЬрд░ рдХреЛ рдлрдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
switch (state$0) { case 0: goto resume$0; case 1: goto resume$1; case 2: goto resume$2;
рдПрдХ рдХреЗрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рдЕрдВрддрд┐рдо рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдкреНрд▓рд╕ рдПрди 2ред