ΠΠΎΡ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.Π‘ΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ 1Π‘ΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ 2
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ ΠΎΡΠΎΠ±ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΠΊΠ°ΠΊ Π² ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ.evt.SomeEvent += (n) => Console.WriteLine("Π‘ΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ " + n);
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ Π΄Π»Ρ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π»ΡΠ±ΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΈΠΏΠΎΠΌ Π΄Π΅Π»Π΅Π³Π°ΡΠ°.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΠ΅ΡΡΠ΅ΠΏΠ΅ΡΡ ΠΎΡΠ΄Π°Π²Π°ΡΡ Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌ, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠΉ Ρ ΡΠ΅Π»ΡΡ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°.// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ.evt.SomeEvent += delegate(int n) { Console.WriteLine("Π‘ΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ " + n);};
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΡΠΎΠ±ΡΡΠΈΠΉ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π΄Π»Ρ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π»ΡΠ±ΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΈΠΏΠΎΠΌΠ΄Π΅Π»Π΅Π³Π°ΡΠ°.Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΏΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠΎΠ±ΡΡΠΈΠΉ Π² ΡΡΠ΅Π΄Π΅ .NET Framework
Π C# ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ³ΠΎΠ΄Π½ΠΎ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ. ΠΠΎ ΡΠ°Π΄ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΡΠΎ ΡΡΠ΅Π΄ΠΎΠΉ .NET Framework ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΉ, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ΅ΠΉ Microsoft. ΠΡΠΈΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ, ΠΏΠΎ ΡΡΡΠ΅ΡΡΠ²Ρ, ΡΠ²ΠΎΠ΄ΡΡΡΡ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ: Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΎΠ±ΡΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΠ΅ΡΠ²ΡΠΉ ΠΈΠ· Π½ΠΈΡ β ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΠΉ ΡΠΎΠ±ΡΡΠΈΠ΅, Π²ΡΠΎΡΠΎΠΉ β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° EventArgs, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π»ΡΠ±ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ±ΡΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, .NET-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΎΠ±ΡΡΡ ΡΠΎΡΠΌΡ.void ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ(object ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ, EventArgs Π΅) { // ...}
ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ β ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΉ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° this. Π ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π΅ ΡΠΈΠΏΠ° EventArgs ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ±ΡΡΠΈΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½, Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ Π½ΡΠΆΠ΅Π½.Π‘Π°ΠΌ ΠΊΠ»Π°ΡΡ EventArgs Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ Π΄Π»ΡΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ. ΠΠ°ΠΏΡΠΎΡΠΈΠ², EventArgs ΡΠ»ΡΠΆΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ³ΠΉ ΠΊΠ»Π°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π²ΡΠ΅Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠΎΠ»Ρ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² ΠΊΠ»Π°ΡΡΠ΅ EventArgs ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅ Empty ΡΠΈΠΏΠ°static, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° EventArgs Π±Π΅Π· Π΄Π°Π½Π½ΡΡ .ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΡΠΌΠΈΡΡΠ΅ΡΡΡ .NET-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠ΅ΡΠΎΠ±ΡΡΠΈΠ΅.// ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ .NET-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ.using System;// ΠΠ±ΡΡΠ²ΠΈΡΡ ΠΊΠ»Π°ΡΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° EventArgs.class MyEventArgs : EventArgs { public int EventNum;}// ΠΠ±ΡΡΠ²ΠΈΡΡ ΡΠΈΠΏ Π΄Π΅Π»Π΅Π³Π°ΡΠ° Π΄Π»Ρ ΡΠΎΠ±ΡΡΠΈΡ.delegate void MyEventHandler(object source, MyEventArgs arg);// ΠΠ±ΡΡΠ²ΠΈΡΡ ΠΊΠ»Π°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΎΠ±ΡΡΠΈΠ΅.class MyEvent { static int count = 0; public event MyEventHandler SomeEvent; // ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ SomeEvent. public void OnSomeEvent() { MyEventArgs arg = new MyEventArgs(); if(SomeEvent != null) { arg.EventNum = count++; SomeEvent(this, arg); } }}class X { public void Handler(object source, MyEventArgs arg) { Console.WriteLine("Π‘ΠΎΠ±ΡΡΠΈΠ΅ " + arg.EventNum + " ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° X."); Console.WriteLine("ΠΡΡΠΎΡΠ½ΠΈΠΊ: " + source); Console.WriteLine(); }}class Y { public void Handler(object source, MyEventArgs arg) { Console.WriteLine("Π‘ΠΎΠ±ΡΡΠΈΠ΅ " + arg.EventNum + " ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° Y."); Console.WriteLine("ΠΡΡΠΎΡΠ½ΠΈΠΊ: " + source); Console.WriteLine(); }}class EventDemo6 { static void Main() { X ob1 = new X(); Y ob2 = new Y(); MyEvent evt = new MyEvent(); // ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Handler() Π² ΡΠ΅ΠΏΠΎΡΠΊΡ ΡΠΎΠ±ΡΡΠΈΠΉ. evt.SomeEvent += ob1.Handler; evt.SomeEvent += ob2.Handler; // ΠΠ°ΠΏΡΡΡΠΈΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅. evt.OnSomeEvent(); evt.OnSomeEvent(); }}
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.Π‘ΠΎΠ±ΡΡΠΈΠ΅ 0 ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° XΠΡΡΠΎΡΠ½ΠΈΠΊ: MyEventΠ‘ΠΎΠ±ΡΡΠΈΠ΅ 0 ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° YΠΡΡΠΎΡΠ½ΠΈΠΊ: MyEventΠ‘ΠΎΠ±ΡΡΠΈΠ΅ 1 ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° XΠΡΡΠΎΡΠ½ΠΈΠΊ: MyEventΠ‘ΠΎΠ±ΡΡΠΈΠ΅ 1 ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° YΠΡΡΠΎΡΠ½ΠΈΠΊ: MyEvent
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ MyEventArgs, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° EventArgs.Π ΠΊΠ»Π°ΡΡΠ΅ MyEventArgs Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΎ Π΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅: EventNum. ΠΠ°ΡΠ΅ΠΌΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π΅Π»Π΅Π³Π°Ρ MyEventHandler, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΉ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, ΡΡΠ΅Π±ΡΡΡΠΈΠ΅ΡΡΠ΄Π»Ρ ΡΡΠ΅Π΄Ρ .NET Framework. ΠΠ°ΠΊ ΠΏΠΎΡΡΠ½ΡΠ»ΠΎΡΡ Π²ΡΡΠ΅, ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΠΉ ΡΠΎΠ±ΡΡΠΈΠ΅, Π° Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β ΡΡΡΠ»ΠΊΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ°EventArgs ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ Π½Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ Handler(), ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ Π² ΠΊΠ»Π°ΡΡΠ°Ρ X ΠΈ Y, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ΅Ρ ΠΆΠ΅ ΡΠ°ΠΌΡΡ ΡΠΈΠΏΠΎΠ².
Π ΠΊΠ»Π°ΡΡΠ΅ MyEvent ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅ SomeEvent ΡΠΈΠΏΠ° MyEventHandler. ΠΡΠΎΡΠΎΠ±ΡΡΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ OnSomeEvent() Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅Π»Π΅Π³Π°ΡΠ° SomeEvent, ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° this, Π° Π²ΡΠΎΡΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ»ΡΠΆΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° MyEventArgs. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΄Π΅Π»Π΅Π³Π°ΡΡ ΡΠΈΠΏΠ°MyEventHandler ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΡΠΎ ΡΡΠ΅Π΄ΠΎΠΉ .NET.ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠ² EventHandler<TEventArgs> ΠΈ EventHandler
Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ»ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ ΡΠΎΠ±ΡΡΠΈΡ. ΠΠΎ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π² ΡΡΠΎΠΌ Π½Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠ΅Π΄Π΅ .NETFramework ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌEventHandler. (ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠ΅ ΡΠΈΠΏΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡΠ² Π³Π»Π°Π²Π΅ 18.) Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΈΠΏ TEventArgs ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠΈΠΏ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ EventArgs ΡΠΎΠ±ΡΡΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²ΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅SomeEvent ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅ MyEvent ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.public event EventHandler<MyEventArgs> SomeEvent;
Π ΠΎΠ±ΡΠ΅ΠΌ, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, Π° Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ.
ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° EventArgs ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΠΌ. ΠΠΎΡΡΠΎΠΌΡ Ρ ΡΠ΅Π»ΡΡ ΡΠΏΡΠΎΡΡΠΈΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡΡ Π² ΡΡΠ΅Π΄Ρ .NETFramework Π²Π½Π΅Π΄ΡΠ΅Π½ Π½Π΅ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ ΡΠΈΠΏΠ° EventHandler. ΠΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠΌ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ±ΡΡΠΈΡΡ . ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π΅Π»Π΅Π³Π°ΡΠ°EventHandler.// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ EventHandler.using System;// ΠΠ±ΡΡΠ²ΠΈΡΡ ΠΊΠ»Π°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΎΠ±ΡΡΠΈΠ΅,class MyEvent { public event EventHandler SomeEvent; // ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π΅Π»Π΅Π³Π°Ρ EventHandler // ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΎΠ±ΡΡΠΈΡ. public void OnSomeEvent() { if(SomeEvent != null) SomeEvent(this, EventArgs.Empty); }}class EventDemo7 { static void Handler(object source, EventArgs arg) { Console.WriteLine("ΠΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅"); Console.WriteLine("ΠΡΡΠΎΡΠ½ΠΈΠΊ: " + source); } static void Main() { MyEvent evt = new MyEvent(); // ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Handler() Π² ΡΠ΅ΠΏΠΎΡΠΊΡ ΡΠΎΠ±ΡΡΠΈΠΉ. evt.SomeEvent += Handler; // ΠΠ°ΠΏΡΡΡΠΈΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅. evt.OnSomeEvent(); }}
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° EventArgs Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ-Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ EventArgs.Empty. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ.ΠΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ΠΡΡΠΎΡΠ½ΠΈΠΊ: MyEventΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ
Π‘ΠΎΠ±ΡΡΠΈΡ Π½Π΅ΡΠ΅Π΄ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π² ΡΠ°ΠΊΠΈΡ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΠΎΠ±ΠΌΠ΅Π½ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈΡΡΠ΅Π΄Π°Ρ , ΠΊΠ°ΠΊ Windows. Π ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΎΡΡΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ°Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΠ½Π° ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. Π’Π°ΠΊΠ°Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡΠΈΠ³ΠΎΠ΄Π½Π° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈΠ‘#, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ Π΄Π»Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡΠ½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. Π’Π°ΠΊ, ΡΠ΅Π»ΡΠΎΠΊ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡΡΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ²ΡΠ·Π°Π½ Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ΠΌLButtonClick. ΠΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎ ΡΠ΅Π»ΡΠΊΠ΅ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡΡΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ OnLButtonClick(), ΠΈ ΠΎΠ± ΡΡΠΎΠΌ ΡΠΎΠ±ΡΡΠΈΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡΡΡ Π²ΡΠ΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π΄Π»Ρ Windows, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Π²ΡΡ ΠΎΠ΄ΠΈΡΠ·Π° ΡΠ°ΠΌΠΊΠΈ ΡΡΠΎΠΉ Π³Π»Π°Π²Ρ, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π°ΡΡΠΈΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠ±ΡΡΠΈΠΉ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π½Π°ΠΆΠ°ΡΠΈΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡ. ΠΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π°Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΡΡΡ ΠΊΠ»Π°Π²ΠΈΡΠ°, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅ KeyPress ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΌΠ΅ΡΠΎΠ΄Π° OnKeyPress(). Π‘Π»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠΎΡΠΌΠΈΡΡΡΡΡΡ .NET-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ ΠΈ ΡΡΠΎ ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ Π² Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΡ .// ΠΡΠΈΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π½Π°ΠΆΠ°ΡΠΈΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅.using System;// Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΊΠ»Π°ΡΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° EventArgs ΠΈ// Ρ ΡΠ°Π½ΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π½Π°ΠΆΠ°ΡΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΡΠΈ.class KeyEventArgs : EventArgs { public char ch;}// ΠΠ±ΡΡΠ²ΠΈΡΡ ΠΊΠ»Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ Π½Π°ΠΆΠ°ΡΠΈΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅.class KeyEvent { public event EventHandler <KeyEventArgs> KeyPress; // ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ. public void OnKeyPress(char key) { KeyEventArgs k = new KeyEventArgs(); if(KeyPress != null) { k.ch = key; KeyPress (this, k); } }}// ΠΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΎΠ±ΡΡΠΈΡ ΡΠΈΠΏΠ° KeyEvent.class KeyEventDemo { static void Main() { KeyEvent kevt = new KeyEvent(); ConsoleKeyInfo key; int count = 0; // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΊΡΠ° Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ. kevt.KeyPress += (sender, Π΅) => Console.WriteLine(" ΠΠΎΠ»ΡΡΠ΅Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ: " + e.ch); // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° Π½Π°ΠΆΠ°ΡΡΡ ΠΊΠ»Π°Π²ΠΈΡ. kevt.KeyPress += (sender, Π΅) => count++; // count β ΡΡΠΎ Π²Π½Π΅ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Console.WriteLine("ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². " + "ΠΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π²Π²Π΅Π΄ΠΈΡΠ΅ ΡΠΎΡΠΊΡ."); do { key = Console.ReadKey(); kevt.OnKeyPress(key.KeyChar); } while(key.KeyChar != '.'); Console.WriteLine("ΠΡΠ»ΠΎ Π½Π°ΠΆΠ°ΡΠΎ " + count + " ΠΊΠ»Π°Π²ΠΈΡ."); }}