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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# 4.0: ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 135

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

        evnt[i] = value;

        break;

      }

    if (i == 3) Console.WriteLine("Бписок событий Π·Π°ΠΏΠΎΠ»Π½Π΅Π½.");

  }

  // Π£Π΄Π°Π»ΠΈΡ‚ΡŒ событиС ΠΈΠ· списка,

  remove {

    int i;

    for(i=0; i < 3; i++)

      if(evnt[i] == value) {

        evnt[i] = null;

        break;

      }

  }

}


Когда Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ событий добавляСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий, вызываСтся аксСссор add, ΠΈ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌ (Ρ‚.Π΅. пустом) элСмСнтС массива evnt запоминаСтся ссылка Π½Π° этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, содСрТащаяся Π² нСявно Π·Π°Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ value. Если Π² массивС ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ свободныС элСмСнты, Ρ‚ΠΎ выдаСтся сообщСниС ΠΎΠ± ошибкС. (РазумССтся, Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ списка Π»ΡƒΡ‡ΡˆΠ΅ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.) Массив evnt состоит всСго ΠΈΠ· Ρ‚Ρ€Π΅Ρ… элСмСнтов, поэтому Π² Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий. Когда ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий удаляСтся ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ событий, Ρ‚ΠΎ вызываСтся аксСссор remove ΠΈ Π² массивС evnt осущСствляСтся поиск ссылки Π½Π° этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° value. Если ссылка Π½Π°ΠΉΠ΄Π΅Π½Π°, Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнту массива присваиваСтся пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (null), Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ удаляСтся ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ событий.

ΠŸΡ€ΠΈ запускС события вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ OnSomeEvent(). Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ происходит цикличСскоС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ элСмСнтам массива evnt для Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий.

Как дСмонстрируСт рассматриваСмый здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ хранСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли Π² этом Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ. Но для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ подходящим оказываСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ хранСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° event Π±Π΅Π· аксСссоров. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ аксСссорная Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° event ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² особых случаях. Π’Π°ΠΊ, Ссли ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π² порядкС ΠΈΡ… приоритСтности, Π° Π½Π΅ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ вводятся Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ событий, Ρ‚ΠΎ для ΠΈΡ… хранСния ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ ΠΏΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ.

------------------------------------

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… прилоТСниях ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ приходится ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ аксСссо-Ρ€Π°ΠΌ событий. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π² Π³Π»Π°Π²Π΅ 23.

------------------------------------


Π Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ возмоТности событий

Бобытия ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈ Π² интСрфСйсах. ΠŸΡ€ΠΈ этом события Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ классами, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ интСрфСйсы. Бобытия ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ абстрактныС (abstract). Π’ этом случаС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ событиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС. Но аксСссорныС Ρ„ΠΎΡ€ΠΌΡ‹ событий Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ абстрактными. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, событиС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ Π³Π΅Ρ€ΠΌΠ΅Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ (sealed). И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, событиС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‚.Π΅. Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС.


ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ вмСстС с событиями

АнонимныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ лямбда-выраТСния особСнно ΡƒΠ΄ΠΎΠ±Π½Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с событиями, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ΄Π΅, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½. А с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ сущСствСнно ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий.

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, лямбда-выраТСниям Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ отдаСтся большСС ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, поэтому Π½Π°Ρ‡Π½Π΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ с Π½ΠΈΡ…. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий.


// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² качСствС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий,

using System;


// ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° для события,

delegate void MyEventHandler(int n);


// ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ класс, содСрТащий событиС,

class MyEvent {

  public event MyEventHandler SomeEvent;

  // Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся для запуска события,

  public void OnSomeEvent(int n) {

    if(SomeEvent != null)

      SomeEvent(n);

  }

}


class LambdaEventDemo {

  static void Main() {

    MyEvent evt = new MyEvent();

    // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² качСствС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий,

    evt.SomeEvent += (n) =>

       Console.WriteLine("Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ " + n);


    // Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ событиС,

    evt.OnSomeEvent(1);

    evt.OnSomeEvent(2);

  }

}


Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.


Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 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.