- •Тверской государственный технический университет
- •События.
- •Содержание
- •1.2. Объявление события
- •1.3. Использование события
- •1.4. Многоцелевая обработка события.
- •1.5. Использования событий в компонентах .Net
- •1.6. Классы с большим числом событий
- •1.7. Что объединяет события, делегаты и свойства
- •Объявление свойства
- •Объявление делегата
- •Объявление события
- •2. Задание на лабораторную работу
- •3. Содержание отчета по лабораторной работе
- •4. Вопросы для самопроверки Отметьте истинные высказывания:
- •1. Обработчик события:
- •2. События:
- •7. Все аргументы события принадлежат:
- •Контрольные вопросы
- •Литература:
1.7. Что объединяет события, делегаты и свойства
Весь изложенный материал говорит о некоторой схожести между событием и делегатом, между делегируемой функцией и обработчиком. Сравним событие с делегатом. Допустим, что выполняется некоторое событие (вызывается одиночный объект делегата) и на него реагирует соответствующий обработчик (выполняется представляемая объектом делегата функция). Другими словами, когда возникает некоторое событие, то вызывается множественный объект делегата и представленные им функции-обработчики реагируют на данное событие. С этой точки зрения смысловое назначение действий, выполняемых в результате возникновения события, во многом совпадает со смысловым назначением действий при использовании делегата. И действительно, событие является можно рассматривать как частный случай делегата. А чем отличается событие от делегата? Дело в том что, если посмотреть на объявление события более внимательно, то можно легко заметить, что слово event существенно изменило употребление делегата в качестве события. Это изменение заключается в том, что волшебное слово event заставляет компилятор внести в код нечто, что делает событие отличным от делегата. В результате объект-делегата, превращённый в объект-событие, уже можно вызвать только внутри того экземпляра класса, в котором этот делегат-событие был объявлен.
Таким образом событие становится принадлежностью конкретного объекта. А событие, возникающее внутри такого объекта "отсылается" к другим объектам, которые реагируют на пришедшее к ним событие с помощью своих обработчиков, связанных именно с тем объектом, в котором это событие возникло.
Здесь важно отметить тот факт, что поскольку событие связано с определённым объектом, то и обработчики других объектов тесно связаны с этим конкретным событием и соответственно - с его объектом. То есть имеет место жесткая фиксация связи между событием и теми обработчиками, которые должны выполняться при генерировании этого события.
Также как и в случае делегата, прежде чем объявлять событие, необходимо объявить делегат события. Делегат события определяет формат функции - обработчика события. Подписавшиеся на событие обработчики всех его подписчиков должна соответствовать этому формату, то есть иметь один и тот же список типов параметров и тип возвращаемого значения. Делегат события может быть объявлен вне класса объекта, если он требуется для классов других объектов или используется самостоятельно. Но можно объявить делегат события и в классе объекта, в котором будет генерироваться событие. Если событие важно и часто используется многими программистами, то для него создают свой собственный делегат и класс для объекта данных этого события. Например, для широко используемого события OnMouseDown нажатия на клавишу мыши создан делегат MouseEventHandler и класс MouseEventArgs для данных.
Давайте сравним объявление свойства, делегата и события
Объявление свойства
int x; // переменная
public int posX // объявление свойства – представителя переменной обычного типа
{
set{ x=value; } // методы доступа к
get{ return x; } // переменной, представляемой свойством
}