Программирование >>  Обработка исключительных ситуаций 

1 ... 73 74 75 [ 76 ] 77 78 79 ... 142


получить с помощью унаследованного метода 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, переработанный с использованием событий.

Приводится упрощенный вариант. В общем случае имеется возможность задавать несколько имен событий, инициализаторы и методы добавления и удаления событий.



1 ... 73 74 75 [ 76 ] 77 78 79 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика