Добавить в цитаты Настройки чтения

Страница 231 из 502

<b>    Console.WriteLine(&quot;Результирующая строка: &quot; + 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(&quot;Произошло событие&quot;);</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>