Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Произошло событие

Программа начинается с такого объявления делегата для обработчика события:

delegate void MyEventHandler();

Все события активизируются посредством делегата. Следовательно, событийный делегат определяет сигнатуру для события. В данном случае параметры отсутствуют, однако событийные параметры разрешены. Поскольку события обычно предназначены для многоадресатной передачи, они должны возвращать значение типа void.

Затем создается класс события MyEvent. При выполнении следующей строки кода, принадлежащей этому классу, объявляется событийный объект SomeEvent:

public event MyEventHandler SomeEvent;

Обратите внимание на синтаксис. Именно так объявляются события всех типов. Кроме того, внутри класса MyEvent объявляется метод OnSomeEvent(), который в этой программе вызывается, чтобы сигнализировать о событии. (Другими словами,этот метод вызывается, когда происходит событие.) Как показано в следующем фрагменте кода, он вызывает обработчик события посредством делегата SomeEvent.

if(SomeEvent!= null)

SomeEvent();

Обратите внимание на то, что обработчик события вызывается только в том случае, если делегат SomeEvent не равен null-значению. Поскольку другие части программы, чтобы получить уведомлении о событии, должны зарегистрироваться, можносделать так, чтобы метод OnSomeEvent() был вызван до регистрации любого обработчика события. Чтобы предотвратить вызов null-объекта, событийный делегат необходимо протестировать и убедиться в том, что он не равен null-значению.

Внутри класса EventDemo создается обработчик события handler(). В этом примере обработчик события просто отображает сообщение, но ясно, что другие обработчики могли бы выполнять более полезные действия. Как показано в следующем фрагменте кода, в методе Main() создается объект класса MyEvent, а метод handler() регистрируется в качестве обработчика этого события.

MyEvent evt = new MyEvent();

// Добавляем метод handler() в список события,

evt.SomeEvent += new MyEventHandler(handler);

Обратите внимание на то, что обработчик добавляется в список с использованием составного оператора "+=". Следует отметить, что события поддерживают только операторы "+=" и " - = ". В нашем примере метод handler() является статическим, но в общем случае обработчики событий могут быть методами экземпляров классов. Наконец, при выполнении следующей инструкции "происходит" событие.

// Генерируем событие.

evt.OnSomeEvent();

При вызове метода OnSomeEvent() вызываются все зарегистрированные обработчики событий. В данном случае зарегистрирован только один обработчик, но их могло бы быть и больше.

 

8.4 Использование событийных средств доступа

Предусмотрены две формы записи инструкций, связанных с событиями. Форма,используемая в предыдущих примерах, обеспечивала создание событий, которые автоматически управляют списком вызова обработчиков, включая такие операции, какдобавление обработчиков в список и удаление их из списка. Таким образом, можнобыло не беспокоиться о реализации операций по управлению этим списком. Поэтомутакие типы событий, безусловно, являются наиболее применимыми. Однако можно исамим организовать ведение списка обработчиков событий, чтобы, например, реализовать специализированный механизм хранения событий.

Чтобы управлять списком обработчиков событий, используйте вторую форму event-инструкции, которая позволяет использовать средства доступа к событиям. Этисредства доступа дают возможность управлять реализацией списка обработчиков событий. Упомянутая форма имеет следующий вид:

event событийный_делегат имя__события {

add {

// Код добавления события в цепочку событий.

}

remove {

// Код удаления события из цепочки событий.

}

}

Эта форма включает два средства доступа к событиям: add и remove. Средстводоступа add вызывается в случае, когда с помощью оператора "+=" в цепочку событийдобавляется новый обработчик, а средство доступа remove вызывается, когда с помощью оператора " - = " из цепочки событий удаляется новый обработчик.

Средство доступа add или remove при вызове получает обработчик, который необходимо добавить или удалить, в качестве параметра. Этот параметр, как и в случае использования других средств доступа, называется value. При реализации средств доступа add и remove можно задать собственную схему хранения обработчиков событий.

Например, для этого вы могли бы использовать массив, стек или очередь.

Пример использования событийных средств доступа. Здесь для хранения обработчиков событий взят массив. Поскольку этот массив содержит три элемента, в любой момент времени в событийной цепочке может храниться только три обработчика событий.

using System;

// Объявляем делегат для события,

delegate void MyEventHandler();

// Объявляем класс события для хранения трех

// обработчиков событий,

class MyEvent {

MyEventHandler[] evnt = new MyEventHandler[3];

public event MyEventHandler SomeEvent {

// Добавляем обработчик события в список,

add {

int i;

for(i=0; i < 3;i++)

if(evnt[i] == null) {

evnt[i] - value;

break;

}

if (i == 3)

<== предыдущая лекция | следующая лекция ==>
Удаление пробелов | Событие получено объектом Y
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 353; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.