Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Public class Display

Public class Connection

{

public event MessageHandler MessageArrived;

Далее событию присваивается имя (в данном случае — имя MessageArrived), после чего это событие объявляется с помощью ключевого слова event и указывается тип делегата, который необходимо использовать (MessageHandler, определенный ранее).

После того как событие определено подобным способом, появляется возможность вызывать его наступление простым обращением по имени — точно таким же образом, как если бы оно представляло собой метод с сигнатурой, определяемой делегатом. Например, вызвать наступление данного события можно следующим образом:

MessageArrived(“This is a message.”);

Если бы делегат был описан как не имеющий параметров, то можно было бы вызвать наступление события проще:

MessageArrived();

Напротив, можно было бы описать большее число параметров, что потребовало бы большего количества кода для генерации события. В данном случае метод CheckForMessage () (проверка, не пришло ли сообщение) имеет следующий вид:

private void CheckForMessage(object source, ElapsedEventArgs e)

{

Console.WriteLine(“Checking for new messages.”);

Random random = new Random ();

if ((random. Next (9) == 0) && (MessageArrived!= null))

{

MessageArrived(“Hello Mum! “);

}

}

Здесь используется экземпляр объекта класса Random, который описывался в предшествующих главах. Он генерирует случайное число в диапазоне между 0 и 9, и наступление события вызывается только в том случае, если это число равно 0, что должно происходить в 10% случаев. Это позволяет эмулировать опрос соединения на предмет поступления сообщения, которое не обязательно приходит каждый раз при выполнении проверки.

Обратите внимание на то, что здесь используется некоторая дополнительная логика. Наступление события вызывается только в том случае, если значение выражения MessageArrived!= null равняется true. Это выражение, в котором также используется синтаксис делегата, хотя и в несколько необычном виде, означает: "Имеются ли у данного события какие-либо подписчики?". Если подписчиков не существует, то MessageArrived получает значение null, и в этом случае нет никакого смысла генерировать наступление события.

Класс, являющийся подписчиком данного события, называется Display и состоит из единственного метода DisplayMessage(), который описывается следующим образом:

{

public void DisplayMessage(string message)

{

Console.WriteLine(“Message arrived: (0)”, message);

}

}

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

Все, что теперь необходимо сделать в методе Main(),— это инициализировать экземпляры классов Connection и Display и запустить процесс. Код, который для этого нужно использовать, аналогичен коду из первого примера:

static void Main(string[] args)

{

Connection myConnection = new Connection ();

Display myDisplay = new Display ();

myConnection.MessageArrived +=

new MessageHandler (myDisplay.DisplayMessage);

myConnection.Connect();

Console.ReadLine();

}

В данном случае, после того как аппарат работы с событиями запущен посредством обращения к методу Connect () объекта Сonnection, для приостановки выполнения функции Main() вызывается метод Console.ReadLine().

<== предыдущая лекция | следующая лекция ==>
Namespace Chl2ExO2 | Возвращаемые значения и обработчики событий
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 219; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.036 сек.