.NET Framework & C#
Модуль 6 Делегати, події
Поняття делегата
 Делегат – це об’єкт який може посилатись на метод.
Делегат може зберігати посилання на метод і з його
допомогою викликати даний метод. Технічно делегат
- це тип посилання, якій інкапсолює метод з
вказаною сигнатурою і типом повернення.
Andrii Hladkyi
trilobt@gmail.com 2
Синтаксис оголошення делегата
 Для оголошення делегата використовується ключове слова delegate.
 Type – тип повернення
 DelegateName – ім’я делегата
 List - список параметрів, необхідних методам при виклику їх за
допомогою делегата.
 Делегат може викликати як методи екземплярів класу так і
статичні методи
 Делегат може приймати один з п’яти модифікаторів доступу
Andrii Hladkyi
trilobt@gmail.com 3
delegate Type DelegateName (List)
Andrii Hladkyi
trilobt@gmail.com 4
Демонстрація
Цілі і задачі делегата
 Делегати використовуються в наступних
випадках:
◦ При паралельному запуску декількох операцій одночасно
◦ При роботі з графічним інтерфейсом користувача
використовуються події. Ми заздалегідь не знаємо, які діє
виконає користувач і відповідно які методи потрібно
викликати
 Делегат дозволяє визначити, який метод
потрібно викликати не на етапі компіляції а
на етапі виконання.
Andrii Hladkyi
trilobt@gmail.com 5
Andrii Hladkyi trilobt@gmail.com 6
Демонстрація
Виклик декількох методів через делегат (multicasting)
 Коли необхідно викликати з одного делегата два чи
більше методів.
 Для реалізації множинного делегування делегат
повинен повертати тип void.
 Додавання методів до списку викликів делегата
виконуються за допомогою операції +=
 Видалення методів із списку викликів виконується за
допомогою операції -=
 Об’єднати делегати можна за допомогою операції +.
Отримаємо новий делегат, який буде викликати
методи об’єднаних делегатів
Andrii Hladkyi
trilobt@gmail.com 7
Andrii Hladkyi
trilobt@gmail.com 8
Демонстрація
Розглянемо клас Circle, в якому описані чотири методи, які виводять на
консоль радіус, діаметр, довжину окружності, площу кола
Поняття події
 Подія – це повідомлення про виникнення деякої дії.
Це може бути натиснення на кнопку, вибір елементу
із списку і т.д.
 Відправником події може бути будь який компонент
форми, або сам додаток.
 Відправник – це об’єкт, який генерує подію.
Отримати повідомлення про подію може будь який
інший об’єкт, якому це потрібно.
Andrii Hladkyi
trilobt@gmail.com 9
Поняття події
 Для того щоб об’єкт знав про виникнення даної
події, його потрібно підписати на цю подію.
Потрібно задати метод обробник даної події.
 Для реалізації події використовуються делегати.
Об’єкт відправник визначає делегат, а кожний об’єкт
отримувач додає свій метод обробник ланцюжок
посилань делегата. Виклик ланцюжка методів
здійснює об’єкт відправник, ініціює виконання всіх
методів.
Andrii Hladkyi
trilobt@gmail.com 10
Синтаксис оголошення події
 Для оголошення події використовується ключове слово event.
 DelegateName – ім’я використовуваного делегата
 EventName – ім’я події
 Якщо на подію немає підписаних обробників, то вона має значення
null, а її виклик викликає помилку виконання. Існує домовленість, по
якій делегати обробники подій повертають тип void і мають два
параметри. Перший - об’єкт відправник тип object, а другий – об’єкт,
що містить інформацію і параметри події, похідний від класу
EventArgs.
 Розглянемо клас Person, який має метод Work() і подію, яка немає
параметрів, WorkEnded, що інформує про завершення виконання
роботи.
Andrii Hladkyi
trilobt@gmail.com 11
event DelegateName EventName;
Andrii Hladkyi
trilobt@gmail.com 12
Демонстрація
Необхідність і особливість використання подій
 Головним плюсом подій є те, що вони дозволяють
зробити об’єкт відправник і об’єкт отримувач
незалежними один від одного, так як вони розділені
делегатом. Це робить код більш гнучким, дозволяє
розробнику змінювати реакцію на подію, додавати
нових підписників.
Andrii Hladkyi
trilobt@gmail.com 13
Застосування подій для багато адресного делегата
 Одна подія може активізувати декілька обробників, навіть якщо
вини оголошені в інших об’єктах.
Створимо клас Ticker, його метод RunTicker() генерує подію
TickEvent кожні 10 мс.
Andrii Hladkyi
trilobt@gmail.com 14
Andrii Hladkyi
trilobt@gmail.com 15
Демонстрація
Використання подійних засобів доступу
 В C# існує форма event-інструкцій, яка дозволяє
використовувати засоби доступу до подій. Ці засоби доступу
дають можливість керувати реалізацією списком обробників
подій.
Andrii Hladkyi
trilobt@gmail.com 16
even nameDelegate nameEvent
{
add { //Код додання подій в список подій }
remove { //Код видалення подій із списку подій }
}
Анонімні методи
 Анонімний метод – це блок коду, який приймає в
якості параметра делегат. Він має “заголовок”, який
містить ключове слово delegate і список параметрів
анонімного методу.
 При обробці подій також можна використовувати
анонімні методи.
Andrii Hladkyi
trilobt@gmail.com 17
Andrii Hladkyi
trilobt@gmail.com 18
Демонстрація
Andrii Hladkyi
trilobt@gmail.com 19
Реалізувати метод, який здійснює пошук елемента в
масиві. Метод повинен приймати масив Object[] array,
в якому повинен здійснюватись пошук, і делегат, що
визначає чи являється елемент шуканим

NET Framework and C# Module 6. Delegates, Events

  • 1.
    .NET Framework &C# Модуль 6 Делегати, події
  • 2.
    Поняття делегата  Делегат– це об’єкт який може посилатись на метод. Делегат може зберігати посилання на метод і з його допомогою викликати даний метод. Технічно делегат - це тип посилання, якій інкапсолює метод з вказаною сигнатурою і типом повернення. Andrii Hladkyi trilobt@gmail.com 2
  • 3.
    Синтаксис оголошення делегата Для оголошення делегата використовується ключове слова delegate.  Type – тип повернення  DelegateName – ім’я делегата  List - список параметрів, необхідних методам при виклику їх за допомогою делегата.  Делегат може викликати як методи екземплярів класу так і статичні методи  Делегат може приймати один з п’яти модифікаторів доступу Andrii Hladkyi trilobt@gmail.com 3 delegate Type DelegateName (List)
  • 4.
  • 5.
    Цілі і задачіделегата  Делегати використовуються в наступних випадках: ◦ При паралельному запуску декількох операцій одночасно ◦ При роботі з графічним інтерфейсом користувача використовуються події. Ми заздалегідь не знаємо, які діє виконає користувач і відповідно які методи потрібно викликати  Делегат дозволяє визначити, який метод потрібно викликати не на етапі компіляції а на етапі виконання. Andrii Hladkyi trilobt@gmail.com 5
  • 6.
    Andrii Hladkyi trilobt@gmail.com6 Демонстрація
  • 7.
    Виклик декількох методівчерез делегат (multicasting)  Коли необхідно викликати з одного делегата два чи більше методів.  Для реалізації множинного делегування делегат повинен повертати тип void.  Додавання методів до списку викликів делегата виконуються за допомогою операції +=  Видалення методів із списку викликів виконується за допомогою операції -=  Об’єднати делегати можна за допомогою операції +. Отримаємо новий делегат, який буде викликати методи об’єднаних делегатів Andrii Hladkyi trilobt@gmail.com 7
  • 8.
    Andrii Hladkyi trilobt@gmail.com 8 Демонстрація Розглянемоклас Circle, в якому описані чотири методи, які виводять на консоль радіус, діаметр, довжину окружності, площу кола
  • 9.
    Поняття події  Подія– це повідомлення про виникнення деякої дії. Це може бути натиснення на кнопку, вибір елементу із списку і т.д.  Відправником події може бути будь який компонент форми, або сам додаток.  Відправник – це об’єкт, який генерує подію. Отримати повідомлення про подію може будь який інший об’єкт, якому це потрібно. Andrii Hladkyi trilobt@gmail.com 9
  • 10.
    Поняття події  Длятого щоб об’єкт знав про виникнення даної події, його потрібно підписати на цю подію. Потрібно задати метод обробник даної події.  Для реалізації події використовуються делегати. Об’єкт відправник визначає делегат, а кожний об’єкт отримувач додає свій метод обробник ланцюжок посилань делегата. Виклик ланцюжка методів здійснює об’єкт відправник, ініціює виконання всіх методів. Andrii Hladkyi trilobt@gmail.com 10
  • 11.
    Синтаксис оголошення події Для оголошення події використовується ключове слово event.  DelegateName – ім’я використовуваного делегата  EventName – ім’я події  Якщо на подію немає підписаних обробників, то вона має значення null, а її виклик викликає помилку виконання. Існує домовленість, по якій делегати обробники подій повертають тип void і мають два параметри. Перший - об’єкт відправник тип object, а другий – об’єкт, що містить інформацію і параметри події, похідний від класу EventArgs.  Розглянемо клас Person, який має метод Work() і подію, яка немає параметрів, WorkEnded, що інформує про завершення виконання роботи. Andrii Hladkyi trilobt@gmail.com 11 event DelegateName EventName;
  • 12.
  • 13.
    Необхідність і особливістьвикористання подій  Головним плюсом подій є те, що вони дозволяють зробити об’єкт відправник і об’єкт отримувач незалежними один від одного, так як вони розділені делегатом. Це робить код більш гнучким, дозволяє розробнику змінювати реакцію на подію, додавати нових підписників. Andrii Hladkyi trilobt@gmail.com 13
  • 14.
    Застосування подій длябагато адресного делегата  Одна подія може активізувати декілька обробників, навіть якщо вини оголошені в інших об’єктах. Створимо клас Ticker, його метод RunTicker() генерує подію TickEvent кожні 10 мс. Andrii Hladkyi trilobt@gmail.com 14
  • 15.
  • 16.
    Використання подійних засобівдоступу  В C# існує форма event-інструкцій, яка дозволяє використовувати засоби доступу до подій. Ці засоби доступу дають можливість керувати реалізацією списком обробників подій. Andrii Hladkyi trilobt@gmail.com 16 even nameDelegate nameEvent { add { //Код додання подій в список подій } remove { //Код видалення подій із списку подій } }
  • 17.
    Анонімні методи  Анонімнийметод – це блок коду, який приймає в якості параметра делегат. Він має “заголовок”, який містить ключове слово delegate і список параметрів анонімного методу.  При обробці подій також можна використовувати анонімні методи. Andrii Hladkyi trilobt@gmail.com 17
  • 18.
  • 19.
    Andrii Hladkyi trilobt@gmail.com 19 Реалізуватиметод, який здійснює пошук елемента в масиві. Метод повинен приймати масив Object[] array, в якому повинен здійснюватись пошук, і делегат, що визначає чи являється елемент шуканим