В приведенном выше примере программы объявлялся собственный делегат со
бытия. Но как правило, в этом не никакой необходимости, поскольку в среде .NET
Framework предоставляется встроенный обобщенный делегат под названием
EventHandler. (Более подробно обобщенные типы рассматриваются
в главе 18.) В данном случае тип TEventArgs обозначает тип аргумента, передаваемого
параметру EventArgs события. Например, в приведенной выше программе событие
SomeEvent может быть объявлено в классе MyEvent следующим образом.
public event EventHandler
В общем, рекомендуется пользоваться именно таким способом, а не определять собственный делегат.
Для обработки многих событий параметр типа EventArgs оказывается ненуж ным. Поэтому с целью упростить создание кода в подобных ситуациях в среду .NET Framework внедрен необобщенный делегат типа EventHandler. Он может быть ис пользован для объявления обработчиков событий, которым не требуется дополни тельная информация о событиях. Ниже приведен пример использования делегата EventHandler. // Использовать встроенный делегат EventHandler. using System; // Объявить класс, содержащий событие, class MyEvent { public event EventHandler SomeEvent; // использовать делегат EventHandler // Этот метод вызывается для запуска события. public void OnSomeEvent { if(SomeEvent != null) SomeEvent(this, EventArgs.Empty); } } class EventDemo7 { static void Handler(object source, EventArgs arg) { Console.WriteLine("Произошло событие"); Console.WriteLine("Источник: " + source); } static void Main { MyEvent evt = new MyEvent; // Добавить обработчик Handler в цепочку событий. evt.SomeEvent += Handler; // Запустить событие. evt.OnSomeEvent; } }
В данном примере параметр типа EventArgs не используется, поэтому в качестве этого параметра передается объект-заполнитель EventArgs.Empty. Результат выпол нения кода из данного примера следующий. Произошло событие Источник: MyEvent Практический пример обработки событий
События нередко применяются в таких ориентированных на обмен сообщениями средах, как Windows. В подобной среде программа просто ожидает до тех пор, пока не будет получено конкретное сообщение, а затем она предпринимает соответствую щее действие. Такая архитектура вполне пригодна для обработки событий средствами С#, поскольку дает возможность создавать обработчики событий для реагирования на различные сообщения и затем просто вызывать обработчик при получении кон кретного сообщения. Так, щелчок левой кнопкой мыши может быть связан с событием LButtonClick. При получении сообщения о щелчке левой кнопкой мыши вызывает ся метод OnLButtonClick, и об этом событии уведомляются все зарегистрирован ные обработчики.