Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
гавно для печати.docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
171.17 Кб
Скачать

43. Делегаты. Назначение делегатов. Многоадресатная передача.

В консольных приложениях программный код Main() тем или иным способом направлял запросы соответствующим объектам. В Windows-приложениях должно существовать обратное обращение объекта к обращаемой стороне (ОС), ведь они выполняются нелинейно. Например, в приложениях архитектуры WindowsForms нужно выполнять действия только по щелчку кнопки мыши, нажатию клавиш и др. В серверных приложениях нужно ожидать сетевого запроса. В среде .NET Framework реализация таких сценариев возможна с использованием интерфейсов обратного вызова, а также событий и делегатов. Интерфейсы определяют поведение, которое может поддерживаться самыми разными типами (объектами классов). Но интерфейс использовать трудоемко: нужно разработать класс-посредник, который реализует интерфейс обратного вызова. В С# лучше обрабатывать сообщения ОС с помощью событий и делегатов. События (event) – это отправленное объектом уведомление о совершении какого-либо действия. Действие может быть выполнено пользователем или программой. Объект, сгенерировавший событие, называется отправителем событий. Объект, перехвативший событие и реагирующий на него, называется получателем событий. При обработке событий объект-отправитель «не знает», какой объект или метод получит (обработает) событие. Поэтому нужен посредник между источником и получателем события. Делегат – объект, кот.может ссылаться на метод. При создании делегата в С# указывается не только имя метода, но и набор передаваемых ф-ции параметров (если они есть), и возвращаемое ф-цией значение. Делегат – спец.класс в С#. Делегаты ссылаются на один метод и определяются в период выполнения. Они широко примен. для асинхронной обработки и добавления нестанд. кода к коду классов. Делегаты могут исп.для многих целей, включая методы обратного вызова, определение статических методов и обработку событий. Тип делегата определяется сигнатурой метода, кот.м.б. вызван ч-з каждый конкретный экземпляр. Делегат можно использовать как обычную переменную. Вызов делегата такой же как и вызов обычной ф-ции. Делегат объявляется с пом. ключ. слова delegate. Delegate – это класс, содержащий ссылку (адрес) на метод или, возможно, несколько методов в приложении, которые могут быть вызваны с помощью делегата позже. Делегат хранит 3 элемента информации: - имя метода, к которому должен обращаться вызов; - аргументы метода; - возвращаемое методом значение. После создания делегата и получения такой информации, делегат может динамически (во время работы приложения) вызывать методы, на которые он указывает.

Многоадресатная передача (multicasting) – Это способность создавать список, цепочку вызовов методов, которые автоматически активизируются при вызове делегатов. Для этого создают экземпляр делегата и добавляют имена методов в цепочку вызовов с помощью оператора +=. Делегат с многоадресатной передачей должен возвращать тип void.

44. События. Объявление и генерация событий. Реализация обработчиков событий.

В консольных приложениях программный код Main() тем или иным способом направлял запросы соответствующим объектам. В Windows-приложениях должно существовать обратное обращение объекта к обращаемой стороне (ОС), ведь они выполняются нелинейно. Например, в приложениях архитектуры WindowsForms нужно выполнять действия только по щелчку кнопки мыши, нажатию клавиш и др. В серверных приложениях нужно ожидать сетевого запроса. В среде .NET Framework реализация таких сценариев возможна с использованием интерфейсов обратного вызова, а также событий и делегатов. Интерфейсы определяют поведение, которое может поддерживаться самыми разными типами (объектами классов). Но интерфейс использовать трудоемко: нужно разработать класс-посредник, который реализует интерфейс обратного вызова. В С# лучше обрабатывать сообщения ОС с помощью событий и делегатов. События (event) – это отправленное объектом уведомление о совершении какого-либо действия. Событие – автоматическое уведомление о выполнении некоторых действий. Действие может быть выполнено пользователем или программой. Объект, сгенерировавший событие, называется отправителем событий. Объект, перехвативший событие и реагирующий на него, называется получателем событий. Объявление стандартного делегата событий:

public delegate void EventHandler (object sender EventArgs e);

Примечания: в делегатах ссылка представляет собой адрес метода, хотя он и не объект. Ссылка метода – точка входа при вызове метода. Эту ссылку можно присвоить делегатам. Однако делегат должен вызывать только такие методы, у которых тип возвращаемого значения и список параметров совпадают с соответствующими элементами делегата.