C Sharp/Події: відмінності між версіями

Матеріал з Вікіпідручника
Вилучено вміст Додано вміст
Bunyk (обговорення | внесок)
м added Category:C Sharp using HotCat
DannyS712 (обговорення | внесок)
м <source> -> <syntaxhighlight> (phab:T237267)
 
Рядок 7: Рядок 7:
|
|
<noinclude>
<noinclude>
<source lang="csharp">
<syntaxhighlight lang="csharp">
[модифікатори] event тип-делегату ідентифікатор
[модифікатори] event тип-делегату ідентифікатор
[{
[{
Рядок 14: Рядок 14:
}];
}];


</syntaxhighlight>
</source>
</noinclude>
</noinclude>
|}
|}
Рядок 29: Рядок 29:
Приклад коду:
Приклад коду:
<noinclude>
<noinclude>
<source lang="csharp">
<syntaxhighlight lang="csharp">
class ICanChange
class ICanChange
{
{
Рядок 43: Рядок 43:
}
}
}
}
</syntaxhighlight>
</source>
</noinclude>
</noinclude>


Рядок 50: Рядок 50:
Приклад реєстрації методу для обробки події у зовнішньому коді:
Приклад реєстрації методу для обробки події у зовнішньому коді:
<noinclude>
<noinclude>
<source lang="csharp">
<syntaxhighlight lang="csharp">
OkButton.Click += new EventHandler(OkButtonClick);
OkButton.Click += new EventHandler(OkButtonClick);


Рядок 56: Рядок 56:
// Отримуємо управління під час винекнення події OkButton.Click
// Отримуємо управління під час винекнення події OkButton.Click
}
}
</syntaxhighlight>
</source>
</noinclude>
</noinclude>



Поточна версія на 15:25, 16 квітня 2020

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

Синтаксис:
[модифікатори] 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
   }