События C#

Событие — это механизм, с помощью которого класс-издатель, отправляющий событие может посылать уведомление другим классам-подписчикам уведомление, об определенном событии.
Лучше, проще и даже нужно это демонстрировать в графическом интерфейсе. Но мы пока разбираем консоль. Синтаксис:
модификатор event событийный_делегат объект; Алгоритм создания и использования событий:

  • 1. Создание событийного делегата.
  • 2. Создание класса-издателя. В этом классе определяется событие.
  • 2.1 Создание события, как объект делегата.
  • 2.2 Создание метода, который вызывает событие.
  • 3 Создание класса-подписчика.
  • 3.1 Создание обработчика события.
  • 4. Создание объекта класса-издателя.
  • 5. Создание объекта класса-подписчика.
  • 6. Добавление обработчика события в список события.
  • 7. Генерирование события.

Рассмотрим пример реализации события:

    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;
     }
    }

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

    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 обработчик события должен иметь два параметра: первый — это объект класса-издателя, который генерирует событие, второй — должен иметь тип EventArgs, который ссылается на некую информацию, необходимую обработчику.

    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.

    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;
     }
    }
Обновлено: 26.12.2019 — 20:23

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.