События в C#
События в C#
Делегаты оказываются очень интересными конструкциями с той точки зрения, что они предоставляют возможность реализовать двухстороннее взаимодействие между объектами в памяти. Однако, и вы с этим согласитесь, работа с делегата-ми напрямую предполагает ввод больших по объему шаблонных фрагментов программного кода (определение делегата, объявление членов-переменных, создание пользовательских методов регистрации и отмены регистрации).
Поскольку возможность обратного вызови объектов другим объектом является очень полезной, в C# предлагается специальное ключевое слово event, позволяющее минимизировать неудобства программиста, связанные с непосредственным применением делегатов. При обработке ключевого слова event компилятор автоматически создает для вас методы регистрации и отмены регистрации, а также члены-переменные, необходимые для вашего типа делегата. Ключевое слово event Можно назвать синтаксической "конфеткой", позволяющей экономить время при вводе программного кода.
Замечание. Даже при использовании в C# ключевого слова event вам все равно придется вручную определять связанные с делегатом типы.
Процесс определения события состоит из двух шагов. Во-первых, вы должны определить делегат, который будет содержать методы, вызываемые при наступлении соответствующего события. Затем вы объявляете события (используя ключевое слово C# event) в терминах соответствующего делегата. Определение типа, способного посылать события, имеет следующий шаблон (записанный здесь в псевдокоде).
public class SenderOfEvents {
public delegate возврЗначение AssociatedDelegate(аргументы);
public event AssociatedDelegate ИмяСобытия;
…
}
События типа Car будут иметь те же имена, что и предыдущие делегаты (AboutToBlow и Exploded). Новому делегату, с которым будут ассоциироваться события, будет назначено имя CarEventHandler. Вот начальные изменения, вносимые в определение типа Car.
public class Car {
// Этот делегат работает в связке с событиями Car
public delegate void CarEventHandler(string msg);
// Объект Car может посылать эти события.
public event CarEventHandler Exploded;
public event CarEventHandler AboutToBlow;
…
}
Отправка событий вызывающей стороне выполняется с помощью простого указания имени события и всех обязательных параметров, предусмотренных в определении соответствующего делегата. Вы должны проверить событие на значение null перед тем, как вызывать набор методов делегата, чтобы гарантировать регистрацию события вызывающей стороной. С учетом этого предлагается новый вариант метода Accelerate() для типа Car.
public void Accelerate(int delta) {
// Если машина сломана, генерируется событие Exploded.
if (carIsDead) {
if (Exploded!= null) Exploded("Извините, машина сломалась…");
} else {
currSpeed += delta;
// Вот-вот сломается?
if (10 == maxSpeed – currSpeed && AboutToBlow != null) {
AboutToBlow ("Осторожно! Могу сломаться!");
}
// Пока все OK!
if (currSpeed ›= maxSpeed) carIsDead = true;
else Console.WriteLine("-›CurrSpeed = {0}", currSpeed);
}
}
Мы наделили автомобиль способностью посылать два типа пользовательских событии, избавив себя от необходимости определять пользовательские функции регистрации. Немного позже мы приведем пример использования нашего нового автомобили, но сначала более подробно рассмотрим архитектуру событий.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
События
События Последним из рассматриваемых нами типов объектов синхронизации ядра являются события (events). Объекты события используются для того, чтобы сигнализировать другим потокам о наступлении какого-либо события, например, о появлении нового сообщения.Важной
Исключения и события MI
Исключения и события MI В MI различаются исключения и события. Исключение — это либо ошибка, обнаруженная машиной при исполнении команды, либо определенное состояние, обнаруженное пользовательской программой. Событие — это происшествие, возникающее в процессе работы
Главные события
Главные события Когда выполняется процедура типа Sub, не отображающая форм, ваш программный код полностью контролирует, что и когда делает программа. Но если на экране отображается форма, программа переходит в каком-то смысле в пассивное состояние, ожидая инструкций от
События
События Событие представляет собой нечто, случающееся с объектом, и на что объект может ответить заранее предусмотренным действием. К событиям можно отнести следующее.* Физические действия пользователя программы, например щелчок кнопкой мыши, перемещение курсора,
Звуковые события
Звуковые события Звуковое сопровождение помогает лучше ориентироваться в происходящих событиях, и Windows XP имеет большое количество заготовок, необходимо только связать событие с конкретным звуковым файлом. Например, при получении писем – один звуковой сигнал, при
13.2.7. Ожидание события
13.2.7. Ожидание события Часто один или несколько потоков следят за «внешним миром», а остальные выполняют полезную работу. Все примеры в этом разделе надуманные, но общий принцип они все же иллюстрируют.В следующем примере прикладную задачу решают три потока. Четвертый
События в C#
События в C# Делегаты оказываются очень интересными конструкциями с той точки зрения, что они предоставляют возможность реализовать двухстороннее взаимодействие между объектами в памяти. Однако, и вы с этим согласитесь, работа с делегата-ми напрямую предполагает ввод
"Разборчивые" события
"Разборчивые" события Есть еще одно усовершенствование, которое можно внести в наш пример с CarEvents и которое соответствует шаблону событий, рекомендуемому разработчиками из Microsoft. При исследовании событий, посылаемых данным типом из библиотек базовых классов, вы
8.3. Метаданные события
8.3. Метаданные события Информация относительно событий может быть получена следующим образом:Запрос таблицы EVENTS базы данных INFORMATION_SCHEMAИспользование инструкции SHOW EVENTS.Использование инструкции SHOW CREATE EVENT.Запись событий, выполненных на сервере, может читаться из файла
События
События События Firebird являются "сигналами", которые модули PSQL могут накапливать в процессе выполнения для передачи клиентским приложениям, когда работа будет подтверждена. Клиентские приложения в сети могут прослушивать- с использованием обработчика сообщений-
Переменные события
Переменные события В Firebird появляются логические контекстные переменные INSERTING, UPDATING и DELETING, чтобы поддерживать условные переходы для триггеров, используемых для нескольких событий. Возможным синтаксисом ветвления может быть:IF ({INSERTING | UPDATING | DELETING}OR {UPDATING | DELETING | INSERTING}[OR
События
События События Firebird предоставляют механизм сигнализации, с помощью которого хранимые процедуры и триггеры могут передавать сообщения клиентским приложениям, когда другие приложения подтверждают изменения данных. Клиентские приложения устанавливаются в режим
1.1.7 События
1.1.7 События Когда пользователь нажимает на кнопку мыши или клавишу клавиатуры, или когда окно программы нуждается в перерисовке, или когда происходят другие изменения в системе, сервер подготавливает соответствующий пакет данных и отправляет его той или иной программе
Простейшие события
Простейшие события Рисование мышью в графическом окне Данная программа осуществляет рисование мышью в графическом окне:uses GraphABC;procedure MouseDown(x,y,mb: integer);beginMoveTo(x,y);end;procedure MouseMove(x,y,mb: integer);beginif mb=1 then LineTo(x,y);end;begin // Привязка обработчиков к событиямOnMouseDown := MouseDown;OnMouseMove :=
СОБЫТИЯ: Мы VAS не хотим!
СОБЫТИЯ: Мы VAS не хотим! 17-18 ноября в Санкт-Петербурге состоялась вторая специализированная международная конференция Mobile VAS Conference, на которую съехалось больше трехсот специалистов и представителей компаний из стран СНГ, Европы и Азии, действующих на рынке дополнительных