рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдирд┐рд░реНрдорд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдЕрдВрддрд░рдлрд▓рдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдХреЙрдЯ рдореЗрдпрд░реНрд╕ рдиреЗ рдбреЗрдврд╝ рджрд╢рдХ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ (рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рднрд╛рд╖рд╛рдУрдВ) рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рдпрджрд┐ рд╣рдо C # рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ "рдкреНрд░рдпреЛрдЬреНрдп" рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рддреЗ рд╣реИрдВ; рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ "рд╡рд╕реНрддреБ рд╢реБрджреНрдзрддрд╛" рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдирд┐рдпрдо рдХреЗ рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдорд╛рди рдлреАрдЪрд░ рдХреЗ рд▓реВрдк рд╡реИрд░рд┐рдПрдмрд▓ рдкрд░ рдмрдВрдж рд╣реЛрдирд╛ рд╣реИ рдЬреЛ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рдЕрд╕рдВрддреЛрд╖ рдФрд░ рдЧрд▓рддрдлрд╣рдореА рдХреА рдорд╛рддреНрд░рд╛ рдЗрддрдиреА рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рд╕реА # рднрд╛рд╖рд╛ рдХреЗ 5 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рддреЛ, рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рджреЗрдЦреЗрдВ рдЬреЛ рд▓реВрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рд▓реВрдк рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
var actions = new List<Action>(); foreach(var i in Enumerable.Range(1, 3)) { actions.Add(() => Console.WriteLine(i)); } foreach(var action in actions) { action(); }
рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрдереЛрдЪрд┐рдд рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо "1 2 3" рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд╣рдо рдЙрд╕ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЕрдирд╛рдо рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдирдпрд╛ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдо VS2008 рдпрд╛ VS2010 рдореЗрдВ рдХреЛрдб рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ "3 3 3" рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЗрддрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдкрдХрд░рдг, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ReSharper,
рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреЗ рд╣реИрдВ
ред рдЬреЛрдбрд╝реЗрдВ () рдХрд┐ рд╣рдо рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрд░рд┐рдХ рд▓рд┐рдкрд░реНрдЯ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдмреАрдорд╛рд░ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдереА, рдмрдЧ рдирд╣реАрдВ, рдХрд┐ рдЙрд╕рдиреЗ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ C # 5.0 рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд┐рд╕ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реИ (рдореИрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП C # рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рддрдХ рдирд╣реАрдВ рдЬрд╛рддрд╛,
"Closures in C #" рджреЗрдЦреЗрдВред
тАЭтАЭ ред
C # рдореЗрдВ, рдмрд╛рд╣рд░реА рдЪрд░ рдХрд╛ рдХреИрдкреНрдЪрд░ "рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЪрд░
рдореИрдВ рд╕реНрдЯреИрдХ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдирд╛рдо рд╡рд┐рдзрд┐ рдХрд╛ рд╢рд░реАрд░ рднреА рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
// - class Closure { public int i; public void Action() { Console.WriteLine(i); } } var actions = new List<Action>(); using (var enumerator = Enumerable.Range(1, 3).GetEnumerator()) { // int current; // var closure = new Closure(); while(enumerator.MoveNext()) { // current = enumerator.Current; // foreach closure.i = enumerator.Current; var action = new Action(closure.Action); actions.Add(action); } } foreach (var action in actions) { action(); }
рдЪреВрдВрдХрд┐ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рд┐рдВрдЧрд▓
рдХреНрд▓реЛрдЬрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдкрд╣рд▓реЗ рд▓реВрдк рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж,
рдмрдВрдж рдХрд░реЗрдВ ред рдореИрдВ 3 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛, рдФрд░ рдЪреВрдВрдХрд┐
рдХреНрд░рд┐рдпрд╛ рдЪрд░ рдореЗрдВ рдПрдХ рд╣реА
рдмрдВрдж рд╡рд╕реНрддреБ рдХреЗ рддреАрди рд╕рдВрджрд░реНрдн рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк
рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╣рддреЗ рд╣реИрдВ
ред рдХрд╛рд░реНрд░рд╡рд╛рдИ () рд╣рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдорд┐рд▓рддреА рд╣реИ "3 3 3"ред
C # 5.0 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди
C # 5.0 рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рд╣реЛрдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЦреБрдж рдХреЛ рдЪрд░ рдореЗрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ
рдлреЙрд░реЗрд╕реНрдЯ рд▓реВрдк рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред C # рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреЛрдк рдЬрд┐рд╕рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╡реИрд░рд┐рдПрдмрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрд▓реЛрдЬрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЕрдкрдирд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирддрд╛ рд╣реИред рдЗрд╕реАрд▓рд┐рдП, C # рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛:
var actions = new List<Action>(); foreach(var i in Enumerable.Range(1, 3)) { var tmp = i; actions.Add(() => Console.WriteLine(tmp)); }
рдЕрдЧрд░ рд╣рдо
рдХреНрд▓реЛрдЬрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕рд░рд▓реАрдХреГрдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐
рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдпрд╛
рдХреНрд▓реЛрдЬрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЪрд░ рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдп рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:
using (var enumerator = Enumerable.Range(1, 3).GetEnumerator()) { int current; while(enumerator.MoveNext()) { current = enumerator.Current; // // Closure i var closure = new Closure {i = current}; var action = new Action(closure.Action); actions.Add(action); } }
рд╕реА # 5.0 рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ
рдлрд╝реЙрд░рдЪ рд▓реВрдк рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рддрд╛рдХрд┐
рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдЪрд░
I рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
foreach рд▓реВрдк рдореЗрдВ C # рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд▓реВрдк рд╡реИрд░рд┐рдПрдмрд▓ рдерд╛, рдФрд░ C # 5.0 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдХрд░, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдореВрд▓
рдлреЙрд░реНрдЪ рд▓реВрдк рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ:
using (var enumerator = Enumerable.Range(1, 3).GetEnumerator()) { // C# 3.0 4.0 current //int current; while (enumerator.MoveNext()) { // C# 5.0 current var current = enumerator.Current; actions.Add(() => Console.WriteLine(current)); } }
рдпрд╣
рдлрд╝реЙрд░реЗрд╕реНрдЯ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдмрдирд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рд╣реИ), рдФрд░ рдЬрдм рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд "1 2 3" рдорд┐рд▓рддрд╛ рд╣реИред
рд╡реИрд╕реЗ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓
рдлреЙрд░реНрдЪ рд▓реВрдк рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐
рд▓реВрдк рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рд▓реВрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рднреАрддрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╡реИрд░рд┐рдПрдмрд▓ рд╕реНрд╡рдпрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ
- рдПрд░рд┐рдХ рд▓рд┐рдкрд┐рдкрд░реНрдЯ рд▓реВрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдКрдкрд░ рдмрдВрдж рдХрд░рдирд╛ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдПрд░рд┐рдХ рд▓рд┐рдкрд░реНрдЯ рд▓реВрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдКрдкрд░ рд╕реЗ рднрд╛рдЧ, рднрд╛рдЧ рджреЛ
- рд╕реА # рдореЗрдВ рдХреНрд▓реЛрдЬрд░
- рд╡рд┐рдЬреБрдЕрд▓ C # рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ 11 рдмреАрдЯрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди