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

Slides:



Advertisements
Similar presentations
EXtreme Programming XP Тема 3. XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар,
Advertisements

Interfaces define a behavior that may be supported by various types in your system. Beyond using interfaces to establish polymorphism. interfaces may also.
What does it mean? Year 7, unit 1, lesson Ex. 1, p.17. Listen to the children and answer the questions of the exercise. 2. Ex 2, p.17. Do the exercise,
ЗАРЯДКА НА АНГЛИЙСКОМ ЯЗЫКЕ.  Зарядка на уроке английского языка может стать самым любимым и веселым занятием для детей, при том, что она проходит исключительно.
ООП Классы. Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Философская этика Дилемма заключенного Рассмотрим следующий сценарий: Двух заключенных допрашивали по отдельности; А признаетсяA не признается B признается.
Схема распределения грантов городам-участникам программы Тасис (TCAS) Экологические гранты для муниципалитетов.
Автоматическая генерация кода программ с явным выделением состояний Канжелев С.Ю. магистрант СПбГУ ИТМО Шалыто А.А. доктор технических наук профессор СПбГУ.
Утилизация нефтяного попутного газа: обоснование выбора регулирующего решения Гаврилов В.В. Минэкономразвития России.
Системы с наследованием. Если систему можно представить в виде : Где - непрерывные функции, то такая система называется системой с наследованием. Математическое.
Расторгуев А.C., 545 группа Научный руководитель: Пименов А.А. Рецензент: ст. преп. Смирнова Е.А.
R1R2R3R4R5R6R7R1R2R3R4R5R6R7. Аксиома R 1. В пространстве существуют плоскости. В каждой плоскости пространства выполняются все аксиомы планиметрии.
По учебнику учиться, Каждый любит, каждый рад. И учебник помогает Нам добиться всех наград!
Некомпенсаторное агрегирование и рейтингование студентов Авторы: Гончаров Алексей Александрович, Чистяков Вячеслав Васильевич. НФ ГУ ВШЭ 2010 год.
Стресс и здоровье Презентация Нефёдовой Евгении Николаевны, классного руководителя 9 «Б» класса МОУ СОШ № 30 города Энгельса Саратовской области 2010 год.
Определение необходимого уровня запасов на складе.
Учитель математики Кулакова Т.М. МОУ ООШ №15 г.о Новокуйбышевск Самарской области Сентябрь 2011г.
Преподаватель: Арутюнова Е. В. (ст.преп.) Выполнила: студентка 1 курс ФЖ Манаенкова Елена Москва, 2010.
Что за хулиган толкает пассажиров автобуса то вперед, то назад? Этот хулиган, вернее, хулиганка -
ООП Классы – 2. Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10;
Делегаты. Как созданные объекты могут посылать сообщения тем объектам, которые их породили? При программировании под Windows на С и C++ основное средство.
Блок 3. Семейства белков I. Множественное выравнивание Первый курс, весна 2008, А.Б.Рахманинова.
Особенности Java. Блок static static { } Создание и уничтожение объектов  new – создание объекта  finalyze()
Язык JavaScript Скриптовый язык для выполнения на html-страницах.
Решение задач на движение
Генетика пола, сцепленное с полом наследование.. Мужские и женские особи отличаются наличием половых хромосом. У человека: Женский пол – гомогаметен,
Язык SmallTalk «Чистый» объектно- ориентированный язык.
Анатомия класса. Схожесть с др. языками   С# похож на язык Java в том, что он требует, чтобы вся программная логика была заключена в определения типов.
Основы цифровой обработки речевых сигналов. Общая схема процесса речеобразования x[n] – дискретные отсчеты сигнала возбуждения y[n] – дискретные отсчеты.
Ввод-вывод в C# Сериализация.
Сравнение различных методов хранения XML в реляционных базах данных и в разных системах. Нгуен Тхань Хуен- 545 группа Руководитель : Б.А. Новиков Рецензент:
1 Ребенок в Сети. Ребенок играет?
PHP как язык программирования. Типы данных логические величины int, integer – целые числа real, double, float – вещественные числа string – строки array.
Формантный синтезатор речи. Часть 1. Полюсы и нули – иное понимание Полюс – это пара чисел (B, F), B – ширина форманты, F – частота форманты Нуль – это.
Синтаксис языка Java.
Особенности языка JavaScript и его использования.
Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»
Коллекции. Пространство имен System.Collections Наиболее простой вариант набора элементов — это массив System. Array. Он уже обладает весьма полезными.
Проект «Безопасный браузер» Визовитин Николай Кадашев Дмитрий.
Работа с массивами в C#.
Управляемые провайдеры ADO.NET Подключение к базам данных.
Формализованы ли цели? Устраивает ли вас команда? Каковы этапы процесса? Изменение ИТ структуры? Нужны подрядчики? 1.
Обработка исключений Гудов А.М., Завозкин С.Ю
1 (с) ИТЛаб, ННГУ, ВМК, 2003г Java 2 Micro Edition Жерздев С.В. Java 2 Micro Edition Лаборатория информационных технологий (ИТЛаб) При поддержке фирмы.
ВВЕДЕНИЕ В ВЫЧИСЛИТЕЛЬНУЮ МАТЕМАТИКУ Лекция 5 6 октября 2009 ВЫЧИСЛИТЕЛЬНАЯ ЛИНЕЙНАЯ АЛГЕБРА.
Семафоры-счетчики POSIX Программирование с использованием POSIX thread library.
Анализ и оптимизация плана работ и стоимости проекта.
Учитель Антонова О.Я. Учитель Антонова О.Я. Зерноградская поликлиника.
XML Схемы XML документов. XML Schema созданая Microsoft позволяет избавиться от DTD блоков. Основа – использование пространств имен и очень точная типизация.
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
«Отгадай символы Рождества»
Алгебра логики это раздел математики, изучающий высказывания, рассматриваемые со стороны их логических значений (истинности или ложности) и логических.
Человеко-машинное взаимодействие Лекция 6 Мерзлякова Екатерина Юрьевна к.т.н. доцент ПМиК.
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");
Anekdot ANDROID CLUB Сегодня  Navigation Drawer  CardView  Calligraphy  TextToSpeech.
Применение графического метода для решения различных математических задач Учитель гимназии №3 Шахова Т. А.
Tense review Passive Voice. Его телеграмма пришла, когда я выходил из дома. His telegram came when I was leaving the house. Вчера я купил часы, так как.
33) static void Main() { Action operations = MathOperations.MultiplyByTwo; operations += MathOperations.Square; ProcessAndDisplayNumber(operations, 2.0);
#msdevcon Community Track Microsoft.ServiceFabriс для построения платформы Connected Car Антон Троянов Старший архитектор решений, BrightBox LLC, Россия.
Jokes Jokes Jokes Teacher: Where's your text book? Student: At home. Teacher: What's it doing there? Student: Having a.
Chapter-7 S. NandaGopalan, BIT
Прогнозирование физико-химических свойтсв органических соеденений на основнании их химических строения экпериментально- статисттческими методами Органикалық.
class PrintOnetoTen { public static void main(String args[]) {
Решение типовых расчетных задач по формулам. Определение массовой доли элементов Массовая доля элемента ω(Э) % - это отношение массы данного элемента.
АВТОМОБИЛИ. Первый паровой автомобиль создал в 1769 году французский инженер Кюньо. Машина двигалась вперед со скоростью 8 километров в час.
Сортировка, поиск и фильтрация данных в базе данных и выборках
ПРИНЯТИЕ БРОНИ.
ПРИНЯТИЕ БРОНЕЙ. ОСНОВНЫЕ ФРАЗЫ ПРИ ПРИНЯТИИ БРОНИ ПО ТЕЛЕФОНУ 1. Leto Lounge, (Петровка, Дубровка, Фрунзенская)/ Проект 6/2, имя, приветствие. 2. Уточнение.
Presentation transcript:

События

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

Как мы помним, класс Саг (а точнее, его метод Саг.SpeedUp()) в его текущем состоянии приводит к исключению при попытке увеличить скорость уже вышедшего из строя автомобиля. Однако исключение — это очень сильное средство (если оно не перехватывается должным образом, выполнение программы будет прервано), и если есть возможность обойтись без исключения, лучше попробовать поступить именно так. Правильнее в этой ситуации будет использовать вместо исключения пользовательское событие, возникающее при переходе автомобиля в нерабочее состояние. Класс Car

Мы изменим наш класс Саг, добавив в него два события. Первое событие (AboutToBlow) будет происходить тогда, когда текущая скорость всего на 10 миль в час меньше максимально допустимой. Второе событие (Exploded) будет возникать тогда, когда пользователь пытается ускорить автомобиль, который уже вышел из строя. Создание любого события в С# состоит из двух этапов. Первый этап - создание делегата, который будет использован для вызова нужного нам метода при срабатывании события, а второй этап — определение собственно события при помощи ключевого слова event. Класс Car

// Этот класс Саг будет посылать пользователю // сообщения о своем состоянии public class Car { // Переменная для хранения информации о состоянии // машины private bool dead; // Делегат. Он нужен, чтобы вызвать функцию или // функции при возникновении события public delegate void EngineHandler(string msg); // Два события public static event EngineHandler Exploded; public static event EngineHandler AboutToBlow; … } Класс Car

// Вызываем нужное событие а зависимости от состояния объекта Саг public void SpeedUp(int delta) { // Если автомобиль уже вышел из строя, генерируем // событие Exploded if (dead) { if (Exploded != null) Exploded(“Sorry, this car is dead..."): else { currSpeed += delta; // Приближаемся к опасной черте? Генерируем // событие AboutToBlow if(10 = = maxSpeed - currSpeed) if (AboutToBlow != null) AboutToBlow( "Careful, approaching terminal speed!"); // Все нормально! Работаем как обычно if(currSpeed >= maxSpeed) dead = true; else Console. WriteLine(“\t'CurrSpeed = {0}“, currSpeed); }} Класс Car

Любое событие (в нашем случае событий два — Exploded и AboutToBlow) внутренне представляется следующими членами: статическим классом, определенным как private; методом add_XXXX{); методом remove_XXXX(). Как работают события

Предположим, что мы создали объект класса Саг и теперь наша задача — организовать реакцию на события, которые этот объект будет посылать. Если подумать, то задача заключается в создании метода, представляющего приемник события, — то есть метода, вызываемого делегатом. Формулируем задачу еще конкретнее — нам необходимо вызвать нужный вариант метода add_XXXX ( ), чтобы добавить наш принимающий метод в таблицу указателей на функции в делегате, с которым связано событие. Однако в С# вызвать скрытые методы add_XXXX() и remove_XXXX() напрямую запрещено — это можно делать только при помощи перегруженных операторов += и -= Прием событий

Поэтому «подключить» приемник для прослушивания событий можно только при помощи следующего синтаксиса: // Начинаем прослушивание Саг.Exploded += new Car.EngineHandler(OnBlowUp); Если мы хотим «отключиться» от прослушивания событий, то, конечно, для этого нужен перегруженный оператор -=: // Прекращаем прослушивание: Car.Exploded -= new Car.EngineHandler(OnBlowUp); Прием событий

// настраиваем реакцию на события public class CarApp { public static int Main(string[] args) { Car cl = new Car(“SlugBug“, 100, 10); // Устанавливаем приемники событий Car.Exploded += new Car.EngineHandler(OnBlowUp); Car.AboutToBlow += new Car.EngineHandler(OnAboutToBlow); // Разгоняем машину for (int i = 0; i < 10; i++) cl.SpeedUp(20); return 0; } // Приемник OnBlowUp public static void OnBlowUp(string s) { Console.WriteLine(“Message from car: {0}“, s); } // Приемник OnAboutToBlow public static void OnAboutToBlow (string s) { Console.WriteLine(“Message from car: {0}“, s); } } Прием событий

// Служебный класс для приемников событий public class CarEventSink { // Приемник OnBlowUp для события Exploded public void OnBlowUp(string s) { Console. WriteLine("Message from car: {0}", s); } // Приемник OnAboutToBlow для события AboutToBlow public void OnAboutToBlow(string s) { Console.WriteLine(“Message from car: {0}“, s); } Объекты как приемники событий

public class CarApp { public static int Main(string[] args) { Car c1 = new Car("SlugBug", 100, 10); // Создаем объект с приемниками CarEventSink sink = new CarEventSink(); // Устанавливаем приемники Car.Exploded += new Car.EngineHandler(sink.OnBlowUp); Car.AboutToBlow += new Car.EngineHandler(sink.OnAboutToBlow); for(int i = 0; i < 10; i++) c1.SpeedUp(20); return 0; } Объекты как приемники событий