Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 105

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 99 100 101 102 103 104 < 105 > 106 107 108 109 110 111 .. 320 >> Следующая

void add_AboutToBlow(class CarEvents.Car/EngineHandler 'value') cil managed synchronized
В V
248 Глава 5 * Дополнительные возможности классов С# {
// Code size 22 (0x16) .maxstack 8
ILJ)OOO: ldsfld class CarEvents.Car/EngineHandler CarEvents.Car::AboutToBlow IL 0005: ldarg.O
ILJ006: call class [mscorlіb]Svstem.Delegate
[msco r 1 і b ] System. Del egate:: Combi rve (с 1 a ss [mscorl ibJSysten).Delegate, class [mscorlі b]System. Delegate)
ILJOOb: castclass CarEvents.Car/EngineHandler
IL 0010: stsfld class CarEvents.Car/EngineHandler CarEvents.Car::AboutToBlow ILJ 015: ret } И Конец метода Car::add_AboutToBlow
Как вы, наверное, уже догадываетесь, rerrove__AboutToB1O1» производит аналогичный вызов метода Delegate. Removoi):
.method public tiidebyslg specialname static void remove_AboutToBlow(class CarEvents.Car/
EngineHandler 'value') cil managed synchronized
'1
Il Размер кода 22 (0x16) .maxstack 8
IL_0000: ldsfld class CarEvents.Car/EngineHandler CarEvents.Car:;AboutToBlow ILJ005: ldarg.D
ILJ006: call class [mscorlіb]System.Delegate
[mscor1 і b]System. Delegate::Remove(clas s [mscorlіb]System.Delegate, class [mscor) і b]System.Delega te)
IL_OOOb: castclass CarEvents.Car/EngineHandler
ILJOlO: stsfld class CarEvents.Car/EngineHandler CarEvents.Car: :AboutToBlow ILJ01S: ret ) I/ Конец метода Car::remove_AboutToBlow
В инструкциях ІЬдля самого события можно обнаружить теги [ .addon] и [. ге-moveon] для методов add_XXXX() и remove XXXXO со ссылкой на служебный класс
EngineHandler:
. event CarEvents.Car/EngineHandler AboutToBlow
і"
.addon void CarEvents.Car::add_AboutToBlow(class CarEvents.Car/EngineHandler) .removeon void CarEvents.Car:;remove_AboutTo81ow(class CarEvents.Car/
EngineHandler)
} И Конец события Car::AboutToBlow
Теперь, когда мы познакомились с тем, как создавать события, самое время узнать, как эти события можно принимать.
Прием событий
Предположим, что мы создали объект класса Саг и теперь наша задача — организовать реакцию на события, которые этот объект будет посылать. Если подумать, то задача заключается в создании метода, представляющего приемник события, — то есть метода, вызываемого делегатом. Формулируем задачу еще конкретнее — нам необходимо вызвать нужный вариант метода add_XXXX О, чтобы добавить наш принимающий метод в таблицу указателей на функции в делегате, с которым связано событие. Однако в С# вызвать скрытые методы add_XXXX( j и rernove_XXXX(: напрямую запрещено — это можно делать только при
События 249
помощи перегруженных операторов += и Поэтому «подключить» приемник для прослушивания событий можно только при помощи следующего синтаксиса:
// Начинаем прослушивание
// ObjectVariable.EventName += new ObjectVariablе.DelegateWamef functiопТоСаП);
II
Саг.Exploded *¦ new Car.EngineHandler(OnBlowUp);
Если мы хотим «отключиться* от прослушивания событий, то, конечно, для этого нужен перегруженный оператор
// Прекращаем прослушивание:
// ObjectVarlable.EventName -- new 0bjectVariable.DelegateName(functionToCa11);
Jl
Car.Exploede -- new Car.EngineHandler(OnBlowUp)',
Полный пример реализации реакции на события приведен ниже:
Создаем объект Саг и настраиваем реакцию на события которые этот класс инициируе) public class СагАрр {
public static Int Main(string[] args) I
- new Ca*r$lug?;js\ 100, 10):
Il Устанавливаем приемники событий
Car.Exploded +- new Car.EngineKandler(OnBlowUp):
Car.AboutToBlow +- new Car.EnglneHaridler(OriAboutToBlow):
Il Разгоняем машину (при этом будут инициированы события) for tint 1 - 0: 1 < 10: 1++) cl.SpeedUp(20):
Il Отклочаек приемники событий
Car.Exploded -= new Car.EngineHandler(OnBlowUp):
Car.AboutToBlow -- new Car.EngineHandler(OnAboutToBlow):
Теперь реакции на события нет! fordnt І = 0; І < 10: 1++) cl.SpeedUpCZO);
return 0:
)
Il Приемник OnBlowUp
public static void OnBlowUptstrlng s)
{
Console.WritetlneCMessage from car: {0}". s):
II Приемник OnAboutToBlow
,public static void OnAboutToBlow (string s) {
Console.WriteLine("Message from car: {Q}". s):
}
}
Результат работы этой программы представлен на рис. 5.9. Если мы хотим, чтобы какое-то событие вызывало срабатывание сразу нескольких приемников, надо просто добавить необходимое их количество:
250 Глава 5 • Дополнительные возможности классов
*1
Рис. 5.9. Управляем набором событий для объекта Саг
// Несколько приемников событий
public class СагАрр
I
public static int Main(strir,g[ J args}
Il Создаем объект класса Саг пак обычно Саг с 1 = new CarCSlugBug". 100, 10):
// Устанавливаем приемники событий:
Саг.Exploded += new Car.EngineHandler(OnBlowUp):
Car.Exploded += new Car.Eng-fneHandler(0nBlow(Jp2);
Car.AbOutToBiow +¦= new Car.EngineHandler(OnAboutToBlow);
И Разгоняем машину (при этом будут инициированы события) fortint і - О: і < 10: і++) cl.SpeedUp(20);
II Отключаем приемники событий Car.Exploded -= new Car.EngineHandler(OnBlowUp); Car.Exploded -= new Car.EngineHandlerCOnBlowUp2); .
Console.WriteLine«"«essage from car: {СГ. s):
Предыдущая << 1 .. 99 100 101 102 103 104 < 105 > 106 107 108 109 110 111 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100