Разработка программ для Windows, демонстрирующих такой подход, выходит за рамки этой главы, тем не менее, рассмотрим пример, дающий представление о принципе, по которому действует данный подход. В приведенной ниже программе создается обработчик событий, связанных с нажатием клавиш. Всякий раз, когда на клавиатуре нажимается клавиша, запускается событие KeyPress
при вызове метода OnKeyPress()
. Следует заметить, что в этой программе формируются .NET-совместимые события и что их обработчики предоставляются в лямбда-выражениях.
// Пример обработки событий, связанных с нажатием клавиш на клавиатуре,
using System;
// Создать класс, производный от класса EventArgs и
// хранящий символ нажатой клавиши.
class KeyEventArgs : EventArgs {
public char ch;
}
// Объявить класс события, связанного с нажатием клавиш на клавиатуре,
class KeyEvent {
public event EventHandler
// Этот метод вызывается при нажатии клавиши,
public void OnKeyPress(char key) {
KeyEventArgs k = new KeyEventArgs();
if(KeyPress != null) {
k.ch = key;
KeyPress(this, k) ;
}
}
}
// Продемонстрировать обработку события типа KeyEvent.
class KeyEventDemo {
static void Main() {
KeyEvent kevt = new KeyEvent();
ConsoleKeyInfo key;
int count = 0;
// Использовать лямбда-выражение для
// отображения факта нажатия клавиши,
kevt.KeyPress += (sender, e) =>
Console.WriteLine(" Получено сообщение о нажатии клавиши: " + e.ch);
// Использовать лямбда-выражение для подсчета нажатых клавиш.
kevt.KeyPress += (sender, е) =>
count++; // count — это внешняя переменная
Console.WriteLine("Введите несколько символов. " +
"По завершении введите точку.");
do {
key = Console.ReadKey();
kevt.OnKeyPress(key.KeyChar);
} while(key.KeyChar != '.');
Console.WriteLine("Было нажато " + count + " клавиш.");
}
}
Вот, например, к какому результату приводит выполнение этой программы.
t Получено сообщение о нажатии клавиши: t
e Получено сообщение о нажатии клавиши: e
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() и инициализированной нулевым значением.