C#: Что такое события, зачем нужны и как их создавать

Сегодня речь пойдет о важной составляющей языка программирования C# — событиях или events. Как всегда, я постараюсь рассказать об этом простым и понятным языком 🙂

Для начала давайте попробуем разобраться с тем что же такое события. На самом деле события не несут никакого скрытого смысла и понимать их можно в привычном контексте с аналогией в реальной жизни. Представьте, что Вы сидите за рулем автомобиля перед красным сигналом светофора. Красный свет меняется на желтый (это уже событие), затем на зеленый (это тоже событие). Вы нажимаете на сцепление (а ведь это тоже событие) и т.д. Помимо всего в машине постоянно играет музыка — и это тоже можно расценивать как событие. Думаю смысл понятен. В языке программирования C# все абсолютно идентично. Событие — это что-то что происходит в рамках Вашей программы вне зависимости от того спровоцировал ли это действие пользователь или нет. А реализовываются они с помощью функций.
Теперь давайте рассмотрим вопрос «зачем события нужны». Если Вы поняли что такое событие, возможно, Вы уже догадались зачем они нужны. Если нет поясню — это значительно упрощает программу, помогая избежать сложных участков кода и повторных явных вызовов функций. Давайте рассмотрим пример программы, которая внутри имеет некий таймер секунд. Вам нужно выводить одно сообщение каждые 5 секунд и другое каждые 11. Примерный код данной программы выглядит примерно так:

int seconds = this.timer.Seconds;
if(seconds % 5 == 0) 
{
    Console.WriteLine("Message 1");
}
if(seconds % 11 == 0) 
{
    Console.WriteLine("Message 2");
}

Если же в программе были бы реализованы события наступления 5ой и 11ой секунды, реализация бы выглядела так:

this.timer.eventEvery5Seconds += event5Seconds;
this.timer.eventEvery11Seconds += event11Seconds;

private void event5Seconds()
{
   Console.WriteLine("Message 1");
}
private void event11Seconds()
{
   Console.WriteLine("Message 2");
}

В данном случае нельзя сказать, что программа стала короче, однако мы избавились от выполнения дополнительных вычислений со стороны разработчика. Когда же речь идет о более крупных задачах, такой подход поможет Вам заметно уменьшить число строк программы.
На последок поговорим о том, как же создавать свои собсвенные события. Для этого давайте создадим класс из примера Выше.

class WorkingTimer
{
        private Timer _timer = new Timer(); //таймер для отсчета секунд
        private long _workingSeconds = 0; //переменаня в которой храним сколько секунд сущесвует наш класс

        public event EventHandler Every5Seconds = null; //объявляем в классе событие
        public event EventHandler Every11Seconds = null; //объявляем в классе событие

        /*
        Как видно для создания события используется ключевое слово event, а так же тип данного события (EventHandler), который определяет
        набор аргументов функции события. EventHandler - это стандартное событие которое в качестве аргемнтов принимает объект - отправитель события (обычно используется this)
        и базовый объект EventArgs. Вы можете использовать другие типы или же создавать свои собсвенные.
        */
         
        public WorkingTimer() //конструктор
        {
            this._timer.Interval = 1000; //интервал таймера 1 секунда
            this._timer.Tick += new EventHandler(_timer_Tick); //определяем событие таймера, которое будет вызываться 1 раз в секунду
            this._timer.Start(); //запускаем таймер
        }

        void _timer_Tick(object sender, EventArgs e)  //функция таймера
        {
            this._workingSeconds++; //увеличиваем время жизни на одну секунду
            if (this.Every5Seconds != null && this._workingSeconds % 5 == 0)
            { //если определено событие Every5Seconds и класс сущесвует кратно 5 секундам, вызываем событие Every5Seconds 
                this.Every5Seconds(this, new EventArgs());
            }
            if (this.Every11Seconds != null && this._workingSeconds % 11 == 0)
            { //если определено событие Every11Seconds и класс сущесвует кратно 11 секундам, вызываем событие Every11Seconds 
                this.Every11Seconds(this, new EventArgs());
            }
        }
}

В основной программе пишем слудующий код:

public Form1()
{
    InitializeComponent();

    WorkingTimer w = new WorkingTimer(); //создаем экземпляр описанного выше класса
    w.Every5Seconds += new EventHandler(w_Every5Seconds); //определяем событие Every5Seconds
}

void w_Every5Seconds(object sender, EventArgs e) //функция, которая определяет событие Every5Seconds
{
    MessageBox.Show("Message 1");
}

После запуска программы, мы будем видеть окно с сообщением «Message 1» каждые 5 секунд.

Запись опубликована в рубрике C# с метками , , , , , , , , . Добавьте в закладки постоянную ссылку.