рдпрджрд┐ рдЖрдк рдПрдХ .NET рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рд░ рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдИрд╡реЗрдВрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЬреБрдбрд╝реА рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рд╕рд╣рд┐рдд рдпрдерд╛рд╕рдВрднрд╡ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рдЬрд┐рдирдХреЗ рд╕рд╛рде рд╢рд╛рдпрдж рд╣реА рдХрднреА рдирд┐рдкрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ / рдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
рдПрдХ рдШрдЯрдирд╛ рдХреНрдпрд╛ рд╣реИ?
C # рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рдПрдХ рдЗрдХрд╛рдИ рд╣реИ рдЬреЛ рджреЛ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ: рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред
рдШрдЯрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдЙрджрд╛рд╣рд░рдг:
public event EventHandler Changed;
рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рдЬреНрдЮрд╛рдкрди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдИрд╡реЗрдВрдЯ рдореЙрдбрд┐рдлрд╝рд╛рдпрд░ рдкрд╣рд▓реЗ рдЖрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдИрд╡реЗрдВрдЯ рдХреАрд╡рд░реНрдб, рдЙрд╕рдХреЗ рдмрд╛рдж рдЗрд╡реЗрдВрдЯ рдЯрд╛рдЗрдк, рдЬреЛ рдПрдХ рдбреЗрд▓реАрдЧреЗрдЯ рдЯрд╛рдЗрдк рдФрд░ рдЗрд╡реЗрдВрдЯ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдпрд╛рдиреА рдЙрд╕рдХрд╛ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдИрд╡реЗрдВрдЯ рдХреАрд╡рд░реНрдб рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдВрддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдЫрд┐рдкрддреА рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рддрдВрддреНрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдп рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдШрдЯрдирд╛ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ - рдкреНрд░рддрд┐рдирд┐рдзрд┐
рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ .NET рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ C ++ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдПрдХ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреА рдордВрдЧрд▓рд╛рдЪрд░рдг рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ, рдЧреБрдг рдФрд░ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВред рдЬрдм рдЖрдк рдЗрдирд╡реЛрдХ () рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕реВрдЪреА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рд╕рдВрдХрд▓рдХ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрд▓ рдХреЛ рдПрдХ рдЗрдирд╡реЛрдХ () рдХреЙрд▓ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред
C # рдореЗрдВ, рдбреЗрд▓рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, + рдФрд░ - рдСрдкрд░реЗрдЯрд░реНрд╕ рд╣реИрдВ рдЬреЛ .NET рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХреА рд╕рд┐рдВрдереИрдЯрд┐рдХ рд╢реБрдЧрд░ рд╣реИрдВ, рдЬреЛ рдХреНрд░рдорд╢рдГ рдбреЗрд▓реАрдЧреЗрдЯ.рдХреЙрдореНрдмрд┐рди рдФрд░ рдбреЗрд▓рд┐рдЧреЗрдЯ.рдореИрд╡ рдореЗрдердб рдкрд░ рдХреЙрд▓ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИрдВред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЖрдкрдХреЛ рдХреЙрд▓ рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рдмреЗрд╢рдХ, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (+ = рдФрд░ - =) рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд░реВрдк рднреА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде .NET рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП + рдФрд░ - рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐, рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗ рдШрдЯрд╛рддреЗ рд╕рдордп, рдЙрд╕рдХреА рдХреЙрд▓ рд▓рд┐рд╕реНрдЯ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдирд▓ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
Action a = () => Console.Write("A");
рдШрдЯрдирд╛рдПрдБ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
C # рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдХреНрд╖реЗрддреНрд░ рдЬреИрд╕реА рдШрдЯрдирд╛)ред
- рд╕реНрдкрд╖реНрдЯ рдШрдЯрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рд╕реНрдкрд╖реНрдЯ" рдФрд░ "рдирд┐рд╣рд┐рдд" рд╢рдмреНрдж рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрд░реНрде рдХреЗ рднреАрддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - рдирд┐рд╣рд┐рддред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ C # 4 рдореЗрдВ рдирд┐рдореНрди рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ (рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛):
class Class { public event EventHandler Changed; }
рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
class Class { EventHandler hanged; public event EventHandler Changed { add { EventHandler eventHandler = this.changed; EventHandler comparand; do { comparand = eventHandler; eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.changed, comparand + value, comparand); } while(eventHandler != comparand); } remove { EventHandler eventHandler = this.changed; EventHandler comparand; do { comparand = eventHandler; eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.changed, comparand - value, comparand); } while (eventHandler != comparand); } } }
рдХрд┐рд╕реА рдЗрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╕рдордп рдРрдб рдмреНрд▓реЙрдХ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рдкрд░ рд░рд┐рдо рдмреНрд▓реЙрдХ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпреЗ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИрдВ - рдШрдЯрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдФрд░ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рд╣рдореЗрд╢рд╛ "рдореВрд▓реНрдп" рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЛрдЧрд╛ред рдИрд╡реЗрдВрдЯ рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдХреЛрдк рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдпреЛрдЬрди рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рднреА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрд╢рд╛ рдирд┐рдЬреА рд╣реЛрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдШрдЯрдирд╛ рдХреЛ рд╡рд░реНрдЧ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╕реЗ рдирд┐рд╣рд┐рдд рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
Interlocked.CompareExchange рддреАрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХреНрд░рд┐рдпрд╛ рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдИрд╡реЗрдВрдЯ рдХреЗ рддреБрд▓рдирд╛рддреНрдордХ рдЪрд░ рдХреЛ рд╕реМрдВрдкрдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЕрдиреНрдп рдереНрд░реЗрдб рдЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, Interlocked.CompareExchange рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реВрдк рд╕реАрдорд╛ рд╕реНрдерд┐рддрд┐ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдЧрд▓рд╛ рдкреНрд░рдпрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред
рдРрдб рдФрд░ рдРрдб рдХреЗ рд╕рд╛рде рдПрдб рдХрд░реЗрдВ
рдЬрдм рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреНрд╖реЗрддреНрд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдРрдб / рд░рд┐рдореВрд╡ рдмреНрд▓реЙрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдпрд╛ рд╣рдЯрд╛рддрд╛ рд╣реИ, рджреЛрдиреЛрдВ рдХреЛ рдЙрдкрд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ C # рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдИрд╡реЗрдВрдЯ рддрдВрддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗ рдЗрд╡реЗрдВрдЯ рдбреЗрд▓рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЙрди рдбреЗрд▓рд┐рдЧреЗрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдЗрд╡реЗрдВрдЯ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд▓рд┐рдП рдЧрдП рд╣реИрдВред рдбрд┐рдХреНрд╢рдирд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдЗрд╕рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реИ)ред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ WinForms рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдИрд╡реЗрдВрдЯ рдХреЛ рдХреИрд╕реЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?
рд╕рднреА рд╕рджрд╕реНрдпрддрд╛ рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдБ (рдЬрд┐рдиреНрд╣реЗрдВ + = рдФрд░ - = рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдКрдкрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдХреЙрд▓ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдХрд╛рдо рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдирд┐рд╣рд┐рдд (рдФрд░ рд╕рд╣реА рд╕реНрдкрд╖реНрдЯ) рдШрдЯрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, рдХрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЖрдк рдХреЗрд╡рд▓ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдореВрд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдХреЗред рдЪреВрдВрдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдордиреЗ рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИ (рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ), рддреЛ рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рдХрднреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА - рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдШрдЯрдирд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЦрд╛рд▓реА рд╣реЛред
рдШрдЯрдирд╛ рд╕рдВрд╢реЛрдзрдХ
рд╕реНрдХреЛрдк рд╕рдВрд╢реЛрдзрдХ (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ, рд╕рдВрд░рдХреНрд╖рд┐рдд, рдирд┐рдЬреА, рдЖрдВрддрд░рд┐рдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдУрд╡рд░рд▓реИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЖрднрд╛рд╕реА, рдУрд╡рд░рд░рд╛рдЗрдб, рд╕реАрд▓) рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рд╕рд╛рд░, рдмрд╛рд╣рд░реА)ред рдПрдХ рдИрд╡реЗрдВрдЯ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ (рдирдП) рд╕реЗ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдИрд╡реЗрдВрдЯ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреНрд▓рд╛рд╕ (рд╕реНрдерд┐рд░) рдХрд╛ рд╕рджрд╕реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдЕрдореВрд░реНрдд рд╕рдВрд╢реЛрдзрдХ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдХрдХреНрд╖рд╛ рдХреЗ рд╡рд╛рд░рд┐рд╕реЛрдВ рдХреЛ рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╕рд╛рде рд╣реА рдЗрди рджреЛ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЗ рдпрд╛ рдЧреБрдг рднреА)ред
рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдпреЛрдЬрди рд╣реЛрддреЗ рд╣реИрдВ?
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдШрдЯрдирд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ EventHandler рдФрд░ EventHandler <TEventArgs> рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд╣рд╛рдВ TEventArgs EventArgs рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИред EventHandler рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдШрдЯрдирд╛ рддрд░реНрдХ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ EventHandler <TEventArgs> рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдШрдЯрдирд╛ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - EventArgs рд╕реЗ рдПрдХ рд╡рд╛рд░рд┐рд╕ред рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП EventHandler <TEventArgs> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рд╕реБрдВрджрд░ рджрд┐рдЦрддрд╛ рд╣реИред
C # 3 рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рд╣реИ?
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдлрд╝реАрд▓реНрдб-рдЬреИрд╕реА рдШрдЯрдирд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди C # 4 рднрд╛рд╖рд╛ (.NET 4.0) рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВред
рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓реЙрдХрд▓ рдХреЗ рд╕рд╛рде рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ (рдпрд╣) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд┐рд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд▓реЙрдХ (рдЯрд╛рдЗрдкреЛрдлрд╝ (рдХреНрд▓рд╛рд╕)) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ C # 3 рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдШрдЯрдирд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рдорд╛рди рдХреЛрдб рд╣реИ:
class Class { EventHandler changed; public event EventHandler Changed { add { lock(this) { changed = changed + value; } } remove { lock(this) { changed = changed - value; } } } }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред + = рдФрд░ - = рдХреЙрд▓ рдбреЗрд▓рд┐рдЧреЗрдЯред рдХреЛрдореНрдмрд╛рдЗрди рдФрд░ рдбреЗрд▓рд┐рдЧреЗрдЯред рд╕реАрдзреЗ рдЬреЛрдбрд╝реЗрдВ / рдирд┐рдХрд╛рд▓реЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди C # 4 рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ! C # 3 рдореЗрдВ, + = рдФрд░ - = рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЪрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред рд╕реА # 4 рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рд╢реВрдиреНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛрдбрд╝реЗрдВ / рдирд┐рдХрд╛рд▓реЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред
рдлрд╝реАрдЪрд░ # 1 - рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рд▓рд╛рдЗрдл рдПрдХреНрд╕рдЯреЗрдВрд╢рди
рдЬрдм рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдИрд╡реЗрдВрдЯ рдХреА рдХреЙрд▓ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЙрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рд╕реМрдВрдкрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдИрд╡реЗрдВрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рддрдм рддрдХ рдореБрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдИрд╡реЗрдВрдЯ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдП рдпрд╛ рдЬрдм рддрдХ рдХрд┐ рдИрд╡реЗрдВрдЯ рд╕реЗ рдпреБрдХреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рдирд╛рд╢ рди рд╣реЛ рдЬрд╛рдПред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдЗрд╕ рдЦрд╛рдореА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдордЬреЛрд░ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрдордЬреЛрд░ рдШрдЯрдирд╛рдУрдВред рдпрд╣ рд╡рд┐рд╖рдп рдкрд╣рд▓реЗ рд╣реА
рд╣реИрдмреЗ рдкрд░ рдЖрдЪреНрдЫрд╛рджрд┐рдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИред
рдлрд╝реАрдЪрд░ # 2 - рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЬрдм рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдИрд╡реЗрдВрдЯ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЙрд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдШрдЯрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреА рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
EventHandler changed; event EventHandler ISomeInterface.Changed { add { changed += value; } remove { changed -= value; } }
рдлрд╝реАрдЪрд░ # 3 - рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓
рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рдо рд╕реЗ рдЖрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдб рдмрдврд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдЬреЙрди рд╕реНрдХреАрдЯ рдиреЗ рдЕрдкрдиреА рдкреБрд╕реНрддрдХ
C # рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдХрд┐рдпрд╛ рд╣реИ :
public event EventHandler Changed = delegate { };
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрддред рд╣рдо рдИрд╡реЗрдВрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрднреА рднреА рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдШрдЯрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рдЖрд░рдВрдн рдХреЗ рджреМрд░рд╛рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рди рддреЛ рдХреЛрдИ рдирд╛рдо рд╣реИ рдФрд░ рди рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рдЗрд╕рдХрд╛ рдХреЛрдИ рд▓рд┐рдВрдХ рд╣реИред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд▓ рдХреА рдЬрд╛рдВрдЪ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рддрдХрдиреАрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ .NET 3.5 рдФрд░ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЪреВрдВрдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдЬрд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдЦрд╛рд▓реА рд╕рдВрджрд░реНрдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
public static class EventHandlerExtensions { public static void SafeRaise(this EventHandler handler, object sender, EventArgs e) { if(handler != null) handler(sender, e); } public static void SafeRaise<TEventArgs>(this EventHandler<TEventArgs> handler, object sender, TEventArgs e) where TEventArgs : EventArgs { if(handler != null) handler(sender, e); } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо Changed.SafeRaise (рдпрд╣, EventArgs.Empty) рдЬреИрд╕реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИред рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ EventArgs.Empty рд╣реЛ рддреЛ рдЖрдк рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдХреЗ рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдлрд┐рд░ рдХреЛрдб рдХреЛ рдмрджрд▓рдХрд░ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреИрдлреЗрдЗрд╕реЗ (рдпрд╣), рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреА рдЯреАрдо рдХреЗ рдЕрдиреНрдп рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕реВрдХреНрд╖реНрдорддрд╛ рд╕рдВрдЦреНрдпрд╛ 4 - рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ ReSharper рд╣реИ, рддреЛ рдЖрдк
рдЙрд╕рдХрд╛ рдЕрдЧрд▓рд╛ рд╕рдВрджреЗрд╢ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдЯреАрдо рд╕рд╣реА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рдирддреА рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрд┐рдирд╛ рдмрддрд╛рдП / рдШрдЯрд╛рд╡ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдШрдЯрдирд╛рдУрдВ / рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕реВрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЖрдкрдХреЗ рдИрд╡реЗрдВрдЯ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ .NET рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ ред рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмреЛрдирд╕: рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреА рдХреЛрд╢рд┐рд╢ рдЧрд░реНрдн-рдирд┐рд░реЛрдзреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рд╣реИ
C # 4 рдХреЗ рдкрд╣рд▓реЗ рдмреАрдЯрд╛ рдореЗрдВ, Microsoft рдиреЗ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЗрд╕рдиреЗ рдЖрдкрдХреЛ EventHandler <MyEventArgs> рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА, рдЬрд┐рд╕рдореЗрдВ EventHandler <EventArgs> рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЗрд╡реЗрдВрдЯ рдбреЗрд▓рд┐рдЧреЗрдЯ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ (рд▓реЗрдХрд┐рди рдЙрдкрдпреБрдХреНрдд) рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЗ рд╕рд╛рде рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдХрд╛рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдРрд╕рд╛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡реЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХреЗ рдФрд░ C # 4 рдХреА рд░рд┐рд▓реАрдЬ рдореЗрдВ, EventHandler рдХреЗ рд▓рд┐рдП рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред
рдпрджрд┐ рдЖрдк рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╕рдордп рдХрд┐рд╕реА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЖрдкрдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:
public class Tests { public event EventHandler<MyEventArgs> Changed; public void Test() { Changed += ChangedMyEventArgs; Changed += ChangedEventArgs; } void ChangedMyEventArgs(object sender, MyEventArgs e) { } void ChangedEventArgs(object sender, EventArgs e) { } }
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реА рдирдП EventHandler <MyEventArgs> (...) рдХреЛ рджреЛрдиреЛрдВ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдирдП EventHandler <EventArgs> (...) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдЧрд╛ - EventHandler рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдкрд░рд┐рдпреЛрдЬрдирд╛)ред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрд░реЛрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЗрдЦ рдХреА рддреИрдпрд╛рд░реА рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЬреЙрди рд╕реНрдХреАрдЯ (рдЬреЙрди рд╕реНрдХреАрдЯ) рдХреА рдкреБрд╕реНрддрдХ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рди рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛ рдЯреВрд▓ рдХрд╛ рднреА рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред