Разработка программ для Windows, демонстрирующих такой подход, выходит
за рамки этой главы, тем не менее, рассмотрим пример, дающий представление о
принципе, по которому действует данный подход. В приведенной ниже програм
ме создается обработчик событий, связанных с нажатием клавиш. Всякий раз, когда
на клавиатуре нажимается клавиша, запускается событие KeyPress при вызове ме
тода OnKeyPress. Следует заметить, что в этой программе формируются .NET-
совместимые события и что их обработчики предоставляются в лямбда-выражениях.
// Пример обработки событий, связанных с нажатием клавиш на клавиатуре.
using System;
// Создать класс, производный от класса EventArgs и
// хранящий символ нажатой клавиши.
class KeyEventArgs : EventArgs {
public char ch;
}
// Объявить класс события, связанного с нажатием клавиш на клавиатуре.
class KeyEvent {
public event EventHandler
Вот, например, к какому результату приводит выполнение этой программы. Введите несколько символов. По завершении введите точку. t Получено сообщение о нажатии клавиши: t е Получено сообщение о нажатии клавиши: е s Получено сообщение о нажатии клавиши: s t Получено сообщение о нажатии клавиши: t . Получено сообщение о нажатии клавиши: . Было нажато 5 клавиш.
В самом начале этой программы объявляется класс KeyEventArgs, производный от класса EventArgs и служащий для передачи сообщения о нажатии клавиши об работчику событий. Затем объявляется обобщенный делегат EventHandler, опреде ляющий обработчик событий, связанных с нажатием клавиш. Эти события инкапсу лируются в классе KeyEvent, где определяется событие KeyPress.
В методе Main сначала создается объект kevt класса KeyEvent. Затем в це почку событий kevt.KeyPress добавляется обработчик, предоставляемый лямбда- выражением. В этом обработчике отображается факт каждого нажатия клавиши, как показано ниже. kevt.KeyPress += (sender, е) => Console.WriteLine(" Получено сообщение о нажатии клавиши: " + e.ch);
Далее в цепочку событий kevt.KeyPress добавляется еще один обработчик, пре доставляемый лямбда-выражением. В этом обработчике подсчитывается количество нажатых клавиш, как показано ниже. kevt.KeyPress += (sender, е) => count++; // count — это внешняя переменная
Обратите внимание на то, что count является локальной переменной, объявленной в методе Main и инициализированной нулевым значением.