Страница 231 из 502
<b> Console.WriteLine("Результирующая строка: " + str);</b>
<b> }</b>
<b>}</b>
Результат выполнения кода этого примера оказывается таким же, как и в первом примере применения делегатов.
<b>Замена пробелов дефисами.</b>
<b>Результирующая строка: Это-простой-тест.</b>
<b>Удаление пробелов.</b>
<b>Результирующая строка: Этопростойтест.</b>
<b>Обращение строки.</b>
<b>Результирующая строка: .тсет йотсорп отЭ</b>
События
Еще одним важным средством С#, основывающимся на делегатах, является событие. Событие, по существу, представляет собой автоматическое уведомление о том, что произошло некоторое действие. События действуют по следующему принципу: объект, проявляющий интерес к событию, регистрирует обработчик этого события. Когда же событие происходит, вызываются все зарегистрированные обработчики этого события. Обработчики событий обычно представлены делегатами.
События являются членами класса и объявляются с помощью ключевого слова event. Чаще всего для этой цели используется следующая форма:
<b>event делегат_события имя_события;</b>
где делегат_события обозначает имя делегата, используемого для поддержки события, а имя_событмя — конкретный объект объявляемого события.
Рассмотрим для начала очень простой пример.
<b>// Очень простой пример, демонстрирующий событие,</b>
<b>using System;</b>
<b>// Объявить тип делегата для события,</b>
<b>delegate void MyEventHandler();</b>
<b>// Объявить класс, содержащий событие,</b>
<b>class MyEvent {</b>
<b> public event MyEventHandler SomeEvent;</b>
<b> // Этот метод вызывается для запуска события,</b>
<b> public void OnSomeEvent() {</b>
<b> if (SomeEvent != null)</b>
<b> SomeEvent();</b>
<b> }</b>
<b>}</b>
<b>class EventDemo {</b>
<b>// Обработчик события,</b>
<b> static void Handler() {</b>
<b> Console.WriteLine("Произошло событие");</b>
<b> }</b>
<b> static void Main() {</b>
<b> MyEvent evt = new MyEvent();</b>
<b> // Добавить метод Handler() в список событий,</b>
<b> evt.SomeEvent += Handler;</b>
<b> // Запустить событие,</b>
<b> evt.OnSomeEvent();</b>
<b> }</b>
<b>}</b>
Вот какой результат получается при выполнении этого кода.
<b>Произошло событие</b>
Несмотря на всю свою простоту, данный пример кода содержит все основные элементы, необходимые для обработки событий. Он начинается с объявления типа делегата для обработчика событий, как показано ниже.
<b>delegate void MyEventHandler();</b>
Все события активизируются с помощью делегатов. Поэтому тип делегата события определяет возвращаемый тип и сигнатуру для события. В данном случае параметры события отсутствуют, но их разрешается указывать.
Далее создается класс события MyEvent. В этом классе объявляется событие SomeEvent в следующей строке кода.
<b>public event MyEventHandler SomeEvent;</b>
Обратите внимание на синтаксис этого объявления. Ключевое слово event уведомляет компилятор о том, что объявляется событие.
Кроме того, в классе MyEvent объявляется метод OnSomeEvent(), вызываемый для сигнализации о запуске события. Это означает, что он вызывается, когда происходит событие. В методе OnSomeEvent() вызывается обработчик событий с помощью делегата SomeEvent.
<b>if(SomeEvent != null)</b>
<b> SomeEvent();</b>
Как видите, обработчик вызывается лишь в том случае, если событие SomeEvent не является пустым. А поскольку интерес к событию должен быть зарегистрирован в других частях программы, чтобы получать уведомления о нем, то метод OnSomeEvent() может быть вызван до регистрации любого обработчика события. Но во избежание вызова по пустой ссылке делегат события должен быть проверен, чтобы убедиться в том, что он не является пустым.
В классе EventDemo создается обработчик событий Handler(). В данном простом примере обработчик событий просто выводит сообщение, но другие обработчики могут выполнять более содержательные функции. Далее в методе Main() создается объект класса события MyEvent, a Handler() регистрируется как обработчик этого события, добавляемый в список.
<b>MyEvent evt = new MyEvent();</b>
<b>// Добавить метод Handler() в список событий,</b>