|
Программирование >> Обработка исключительных ситуаций
получить с помощью унаследованного метода GetlnvocationList. Этот прием иллюстрирует листинг 10.6, представляющий собой измененный вариант листинга 10.1. Листинг 10.в. Перехват исключений при вызове делегата using System; namespace ConsoleApplicationi { delegate void Del ( ref string s ); class Classl public static void C001 ( ref string s ) Console.WriteLineC вызван метод C001 ); string temp = ; for ( int i = 0; i < s.Length; ++i ) if ( s[i] == o s[i] == O) temp += 0; else if ( s[i] == 1 ) temp += Г; else temp += s[i]; s = temp; public static void Hack ( ref string s ) Console.WriteLineC вызван метод Hack ); string temp = ; for ( int i = 0; i < s.Length; ++i ) if ( i / 2 * 2 == i ) temp += char.ToUpperC s[i] ); else temp += s[i]; s = temp; public static void BadHack ( ref string s ) Console.WriteLineC вызван метод BadHack ); throw new Exception(); имитация ошибки static void MainO string s = cool hackers ; Del d = new Del С C001 ) ; создание экземпляра делегата d += new Del( BadHack ); дополнение списка методов d += new DelC Hack ); дополнение списка методов Листинг 10.6 (продолжение) foreach ( Del fun in d.GetlnvocationListO fun( ref s ); catch ( Exception е ) Console.WriteLineC е.Message ); Console.WriteLineC Exception in method fun.Method.Name); вызов каждого метода из списка Console.WriteLineC результат + s ); Результат работы программы: вызван метод COOl вызван метод BadHack Exception of type System.Exception was thrown. Exception in method BadHack вызван метод Hack результат - COOl hAcKeRs В этой программе помимо метода базового класса GetlnvocationList использовано свойство Method. Это свойство возвращает результат типа Method Info. Класс Method Info содержит множество свойств и методов, позволяющих получить полную информацию о методе, например его спецификаторы доступа, имя и тип возвращаемого значения. Мы рассмотрим этот интересный класс в разделе Рефлексия главы 12. События Событие - это элемент класса, позволяющий ему посылать другим объектам уведомления об изменении своего состояния. При этом для объектов, являющихся наблюдателями события, активизируются методы-обработчики этого события. Обработчики должны быть зарегистрированы в объекте-источнике события. Таким образом, механизм событий формализует на языковом уровне паттерн наблюдатель , который рассматривался в предыдущем разделе. Механизм событий можно также описать с помощью модели публикация - подписка : один класс, являющийся отправителем (sender) сообщения, публикует события, которые он может инициировать, а другие классы, являющиеся получателями (receivers) сообщения, подписываются на получение этих событий. События 23 3 События построены на основе делегатов: с помощью делегатов вызываются методы-обработчики событий. Поэтому создание события в классе состоит из следующих частей: описание делегата, задающего сигнатуру обработчиков событий; описание события; описание метода (методов), инициирующих событие. Синтаксис события похож на синтаксис делегата1: [ атрибуты ] [ спецификаторы ] event тип имясобытия Для событий применяются спецификаторы new, public, protected, internal, private, static, virtual, sealed, override, abstract и extern, которые изучались при рассмотрении методов классов. Например, так же как и метод1, событие может быть статическим (static) , тогда оно связано с классом в целом, или обычным - в этом случае оно связано с экземпляром класса. Тип события - это тип делегата, на котором основано событие. Пример описания делегата и соответствующего ему события: public delegate void Del( object о ); объявление делегата class А public event Del Oops; объявление события Обработка событий выполняется в классах-получателях сообщения. Для этого в них описываются методы-обработчики событий, сигнатура которых соответствует типу делегата. Каждый объект (не класс!) , желающий получать сообщение, должен зарегистрировать в объекте-отправителе этот метод. Как видите, это в точности тот же самый механизм, который рассматривался в пре-д1дущем разделе. Единственное отличие состоит в том, что при использовании событий не требуется описывать метод, регистрирующий обработчики, поскольку события поддерживают операции += и - = , добавляющие обработчик в список и удаляющие его из списка. ПРИМЕЧАНИЕ- Событие - это удобная абстракция для программиста. На самом деле оно состоит из закрытого статического класса, в котором создается экземпляр делегата, и двух методов, предназначенных для добавления и удаления обработчика из списка этого делегата. В листинге 10.7 приведен код из листинга 10.2, переработанный с использованием событий. Приводится упрощенный вариант. В общем случае имеется возможность задавать несколько имен событий, инициализаторы и методы добавления и удаления событий.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |