Перейти до вмісту

C Sharp/Події

Матеріал з Вікіпідручника

Події, є основним інструментом мови С#, а також самої операційної системи (але він там дещо інший), що дозволяє внести в програму можливість повідомити клієнтському коду про те, що щось відбулося у вашому класі, візуальному компоненті, та ін.. Сторонній клас може на це відреагувати і виконати необхідні дії.

Синтаксис:
[модифікатори] event тип-делегату ідентифікатор  
[{
   add {команди;}
   remove {команди;} 
}];

Дуже часто події використовуються у графічних компонентах інтерфейсу, але не тільки там.

Події тісно пов'язані із делегатами, тобто для опису події використовуються делегати - спеціальний клас який описує метод, який можна виконати коли відбувається подія.

Коротко, для створення події вам необхідно:

  • Об'явити делегат або використати існуючий (наприклад EventHandler),
  • Об'явити подію використавши даний делегат,
  • Визвати метод в момент коли ви хочете згенерувати подію.

Приклад коду:

class ICanChange
{
   // Делегат
   public delegate void ChangedEventHandler(object sender, EventArgs e);

   public event ChangedEventHandler Change;

   // Як правило ствоюють метод On*, який визиває подію
   protected void OnChangedEventHandler(object sender, EventArgs e)
   {
      if (Change != null) Change(sender,e);
   }
}


Часто виникаэ питання, а чим саме подія відрізняється від простого поля, яке б зберігало посилання на делегат. Відповідь заключається в тому що замість ключових слів set, get в повній декларації події використовуються аналогічні add та remove, які надають можливість підписувати множину перехватчиків подій (тобто делегатів). Ці ключьові слова можна опустити, якщо непотрібно створювати власної логіки при підписуванні на подію. Якщо у зовнішньому коді необхідно підписатися чи відмовитися від подальшої обробки події використовуютсья оператори += і -=.

Приклад реєстрації методу для обробки події у зовнішньому коді:

   OkButton.Click += new EventHandler(OkButtonClick);

   void OkButtonClick(object sender, EventArgs e) {
      // Отримуємо управління під час винекнення події OkButton.Click
   }