Четверг, 13.05.2021, 13:27
Приветствую Вас Гость | RSS | PDA

Всё для студента информата

Полезная информация

Статьи IT

Всё для студента IT » Статьи » Программирование для Microsoft® .NET

Делегаты в .NET Framework

Делегаты часто смущают новичков в .NET Framework. Делегат представляет собой оболочку функции обратного вызова, обеспечивающую контроль типов. Можно без труда написать приложение на неуправляемом C++, которое рухнет при выполнении обратного вызова. Но делегаты просто не позволяют написать управляемое приложение, которое проделало бы то же самое.

Обычно делегаты служат для определения сигнатур методов обратного вызова, которые осуществляют реакцию на событие. К примеру. FCL-класс Timer (член пространства имен System.Timers) определяет событие Elapsed, которое наступает по истечении заданного интервала таймера. Реагирующие на событие Elapsed приложения передают объекту Timer ссылку на метод, который следует вызвать при наступлении этого события. Передаваемая «ссылка» — это не просто адрес памяти, а экземпляр делегата — оболочка адреса этого метода. Именно с этой целью в пространстве имен System.Timers определен делегат ElapsedEventHandler.

Если бы удалось взглянуть на исходный код класса Timer, вы увидели бы что-
то вроде этого:

public delegate void ElapsedEventHandler (Object sender, ElapsedEventArgs e);
public class Timer
{
public event ElapsedEventHandler Elapsed;
}

Вот как Timer инициирует событие Elapsed:

if (Elapsed 1= null) // Убедитесь, что кто-либо слушает
Elapsed (this, new ElapsedEventArgs (...)); // Запуск!

А так клиент мог бы использовать объект Timer, чтобы вызывать метод UpdateData
каждые 60 секунд:

Timer timer = new Timer (60000);
timer.Elapsed += new ElapsedEventHandler (UpdateData);
void UpdateData (Object sender, ElapsedEventArgs e)
{
// Получен обратный вызов!
}

Как видите, UpdateData соответствует сигнатуре, заданной делегатом. Чтобы зарегистрироваться для получения событий Elapsed, клиент создает новый экземпляр ElapsedEventHandler, который обертывает метод UpdateData (ссылка на Update-Data была передана конструктору ElapsedEventHandler) и связывает его с событием Elapsed объекта timer оператором +=, Этот подход применяется в приложениях для .NET Framework повсеместно. События и делегаты представляют собой важную часть системы типов.

На практике полезно знать о том, что происходит, когда компилятор встречает определение делегата. Допустим, компилятору С£ встретился такой код:

public delegate void ElapsedEventHandler (Object sender, ElapsedEventArgs e);

Его ответной реакцией является создание класса, производного от SystemMuUicastDelegate. В этом случае ключевое слово delegate служит просто синонимом следующего:

public class ElapsedEventHandler : MulticastDelegate
{
public ElapsedEventHandler (object target, int method)
{
---
}
public virtual void Invoke (object sender, ElapsedEventArgs e)
{
---
}
}
Производный класс наследует от MulticastDelegate ряд важных членов, включая закрытые поля, идентифицирующие метод, для которого делегат является оболочкой, и экземпляр объекта, в котором реализуется метод (предполагается, что метод является не статическим, а экземплярным). Компилятор добавляет метод Invoke, который и вызывает тот метод, для которого делегат является оболочкой. В С# метод Invoke скрыт, что позволяет обращаться к методу обратного вызова просто по имени экземпляра делегата, как если бы это было имя метода.

Похожие статьи:

Не нашли то, что Вам нужно?.. Найдите ответ на форуме!
Категория: Программирование для Microsoft® .NET | Добавил: Akron (12.02.2012)
Просмотров: 388 | Теги: .NET
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Сообщество
Помощь
Форма входа
Поиск

Студенческий помощник по информатике © 2021
При цитировании материалов данного сайта, обязательна ссылка на источник: ITstudents.ru



>