Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Делегат для выбора методов на этапе выполнения

Использование делегатов

Существует 4 вида использования делегатов:

1. Делегат для выбора методов делегирования (программист не знает, какой метод ему понадобится и задаёт или определяет его во время выполнения программы);

2. Делегат – оповещатель наблюдателя (паттерн “наблюдатель”);

3. Делегат, как обратный вызов метода;

4. Делегат, как обработчик событий. Обычно события обрабатываются не простыми методами, а делегатами. Событие генерирует идею “произошло нечто важное”, и программа должна на него отреагировать. События и делегаты являются тесно связанными понятиями, поскольку обработка событий требует точного выбора обработчика. Обработчик события реализуется на языке С#, как правило, в виде делегата.

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

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

 

 

Delegate.Invoke или что там внутри? (для продвинутых)

Метод Invoke недокументирован. Он не является членом классов Delegate и MulticastDelegate. Соответственно, можно предположить, что это специальный метод, генерируемый компилятором. Его изучение показывает, что метод лишен какого-либо кода. Он попросту пустой и ничего не может делать. Так может показаться, если не принимать во внимание спецификатор runtime, используемый при определении метода. Данный спецификатор указывает на то, что метод будет реализован по ходу исполнения программы самой средой исполнения. Это означает, что код, обрабатывающий вызов метода, располагается в недрах самой среды исполнения. А она прекрасно осведомлена о внутреннем устройстве делегата и справится с вызовом всех его методов без дополнительной помощи со стороны программиста.

Код, реализующий делегат, также находится внутри среды исполнения. Оказывается, метод Invoke отвечает не только за вызов делегата, но также за хранение информации о прототипе методов, на которые может ссылаться делегат. Прототип закодирован в самом методе Invoke, то есть его прототип полностью совпадает с прототипом делегата.

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


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


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



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




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