событие

Событие — это механизм, с помощью которого класс-издатель, отправляющий событие может посылать уведомление другим классам-подписчикам уведомление, об определенном событии.
Лучше, проще и даже нужно это демонстрировать в графическом интерфейсе. Но мы пока разбираем консоль.
Синтаксис:
модификатор event событийный_делегат объект;
Алгоритм создания и использования событий:
  • 1. Создание событийного делегата.
  • 2. Создание класса-издателя. В этом классе определяется событие.
  • 2.1 Создание события, как объект делегата.
  • 2.2 Создание метода, который вызывает событие.
  • 3 Создание класса-подписчика.
  • 3.1 Создание обработчика события.
  • 4. Создание объекта класса-издателя.
  • 5. Создание объекта класса-подписчика.
  • 6. Добавление обработчика события в список события.
  • 7. Генерирование события.

вариант пользовательского создания события

Скрыть

Показать

Копировать
  Main.cs  
  • using System;
  •  
  • //объявление событийного делегата
  • public delegate void dlgUserEventHandler();
  •  
  • //класс издатель
  • class Publisher {
  •  //создание событийного объекта
  •  public event dlgUserEventHandler myEvent;
  •  //создание метода, который вызывает событие
  •  public void CallEvent() {
  •   if(myEvent != null) {
  •    myEvent();
  •   }
  •  }
  • }
  •  
  • //класс подписчик
  • class Subscriber {
  •  //создание обработчика события, который уведомляет, что произошло событие
  •  public void Handler() {
  •   Console.WriteLine("Произошло некоторое событие");
  •  }
  • }
  •  
  • class Program {
  •  public static int Main() {
  •   //создание объекта класса издателя
  •   Publisher P = new Publisher();
  •   //создание объекта класса подписчика
  •   Subscriber S = new Subscriber();
  •   //добавляем обработчик события в список события
  •   P.myEvent += new dlgUserEventHandler(S.Handler);
  •   //вызываем событие
  •   P.CallEvent();
  •   Console.ReadKey();
  •   return 0;
  •  }
  • }
Произошло некоторое событие

статический обработчик события

Скрыть

Показать

Копировать
  Main.cs  
  • using System;
  •  
  • //объявление событийного делегата
  • public delegate void dlgUserEventHandler();
  •  
  • //класс издатель
  • class Publisher {
  •  //создание событийного объекта
  •  public event dlgUserEventHandler myEvent;
  •  //создание метода, который вызывает событие
  •  public void CallEvent() {
  •   if(myEvent != null) {
  •    myEvent();
  •   }
  •  }
  • }
  •  
  • //класс подписчик
  • class Subscriber {
  •  //создание статического обработчика события, который уведомляет, что произошло событие
  •  public static void Handler() {
  •   Console.WriteLine("Произошло некоторое событие");
  •  }
  • }
  •  
  • class Program {
  •  public static int Main() {
  •   //создание объекта класса издателя
  •   Publisher P = new Publisher();
  •   //добавляем обработчик события в список события
  •   P.myEvent += new dlgUserEventHandler(Subscriber.Handler);
  •   //вызываем событие
  •   P.CallEvent();
  •   Console.ReadKey();
  •   return 0;
  •  }
  • }
Произошло некоторое событие

обработчик события с параметрами

Как пишут в "литературах", для компонентной совместимости со средой .NET Framework (а ведь язык C# является официальным языком этой среды) обработчик события должен иметь два параметра: первый — это объект класса-издателя, который генерирует событие, второй — должен иметь тип EventArgs, который ссылается на некую информацию, необходимую обработчику.
Скрыть

Показать

Копировать
  Main.cs  
  • using System;
  •  
  • //объявление событийного делегата
  • public delegate void dlgUserEventHandler(object obj, EventArgs e);
  •  
  • /*создаем класс, производный от класса EventArgs, который не может
  • содержать полей, что бы создать в нем поле*/
  • class MyEventArg : EventArgs {
  •  //какие-то дополнительные данные для обработчика событий
  •  public int countArg;
  • }
  •  
  • //класс издатель
  • class Publisher {
  •  //создание событийного объекта
  •  public event dlgUserEventHandler myEvent;
  •  //создание метода, который вызывает событие
  •  public void CallEvent() {
  •   if(myEvent != null) {
  •    MyEventArg arg = new MyEventArg();
  •    myEvent(this, arg);
  •   }
  •  }
  • }
  •  
  • //класс подписчик
  • class Subscriber {
  •  //создание статического обработчика события, который уведомляет, что произошло событие
  •  public void Handler(object obj, EventArgs e) {
  •   Console.WriteLine("Произошло некоторое событие");
  •  }
  • }
  •  
  • class Program {
  •  public static int Main() {
  •   //создание объекта класса издателя
  •   Publisher P = new Publisher();
  •   //создание объекта класса подписчика
  •   Subscriber S = new Subscriber();
  •   //добавляем обработчик события в список события
  •   P.myEvent += new dlgUserEventHandler(S.Handler);
  •   //вызываем событие
  •   P.CallEvent();
  •   Console.ReadKey();
  •   return 0;
  •  }
  • }
Произошло некоторое событие

использование встроенного делегата EventHandler

В связи с тем, что большинство параметров типа EventArgs не используются, в среде .NET Framework существует встроенный тип делегата EventHandler.
Скрыть

Показать

Копировать
  Main.cs  
  • using System;
  •  
  • //класс издатель
  • class Publisher {
  •  //создание событийного объекта с помощью встроенного делегата EventHandler
  •  public event EventHandler myEvent;
  •  //создание метода, который вызывает событие
  •  public void CallEvent() {
  •   if(myEvent != null) {
  •    //обратите ВНИМАНИЕ на второй аргумент EventArgs.Empty, указывающий, что он пустой
  •    myEvent(this, EventArgs.Empty);
  •   }
  •  }
  • }
  •  
  • //класс подписчик
  • class Subscriber {
  •  //создание статического обработчика события, который уведомляет, что произошло событие
  •  public static void Handler(object obj, EventArgs arg) {
  •   Console.WriteLine("Произошло некоторое событие");
  •  }
  • }
  •  
  • class Program {
  •  public static int Main() {
  •   //создание объекта класса издателя
  •   Publisher P = new Publisher();
  •   //добавляем обработчик события в список события
  •   P.myEvent += new EventHandler(Subscriber.Handler);
  •   //вызываем событие
  •   P.CallEvent();
  •   Console.ReadKey();
  •   return 0;
  •  }
  • }
Произошло некоторое событие