Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ПолноС руководство. Π‘# 4.0Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 108

Автор Π¨ΠΈΠ»Π΄Ρ‚ Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚

Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 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 + " клавиш."); }}