C# → Обработка событий

Обработчик события обязан выглядеть следующим образом:

public void OnClick(object sender, EventArgs a) {
    // обработка события 
}

Обработчик события не может возвращать ничего кроме void, отсутствуют механизмы возврата значения. Все что можно сделать – вызвать метод. Sender – ссылка на объект, который сгенерировал событие (генератор события передает ссылка на самого себя). Параметр а должен быть ссылкой либо на базовый класс System.EventArgs (общий базовый класс для всех уведомлений о произошедших событиях), либо на производный класс. Производный класс может содержать дополнительную информацию о событии, например местоположение мыши, клавиша нажатая на клавиатуре.

Пример обработки событий:

using System;
namespace MyPrimer.Events
{
    // мой клас для передачи болле детальных сведений о событии
    public class CatEventArgs : EventArgs
    {
        public string CatName;
        public CatEventArgs(string initCatName) :base()
        {
            CatName = initCatName;
        }
    }
    // описываем класс который будет просто содержать метод 
    // обработчик нашего события CatIsSeekEvent
    public class Seek
    {
        // обработчик события
        public void OnCatSeek(object sender, CatEventArgs e)
        {
            Console.WriteLine("Только что кот " + e.CatName + " заболел!");
        }
    }
    // мой класс будет (может) генерировать событие MyEvent
    public class Cat
    {
        public string name;
        // делегат, в котором будет храниться даресс метода
        // который будет автоматически вызиваться при возникновении события
        public delegate void EventDelegate (object sender, CatEventArgs e);
        // описсываем событие (на основе делегата)
        public event EventDelegate CatIsSeekEvenet;
        // метод, предназначенный для активизации обработчика событий
        public void Activate_CatIsSeekEvent()
        {
            // задан ли обработчик события?
            if (CatIsSeekEvenet != null)
            {
                // если содержится ссылка на обработчик
                // то происходит генерация события и вызов обработчика
                CatIsSeekEvenet(this, new CatEventArgs(name));
            }
        }
    }
    // -----
    public class myProgram
    {
        public static void Main()
        {
            Seek seek = new Seek();
            Cat Frisky = new Cat();
            Frisky.name = "Frisky";
            // сообщаем что желаем получать уведомления о событиях
            // задаем обработчик
            Frisky.CatIsSeekEvenet += new Cat.EventDelegate(seek.OnCatSeek);
            // вызов события. событие вызывает объект Frisky (this)
            // и передает информацию о событии
            Frisky.Activate_CatIsSeekEvent();
            Console.ReadKey();
        }
    }
}