Шаг 186.
Язык программирования C#. Начала.
Делегаты и события. Выводы
На этом шаге мы подведем некоторые итоги.
Подведем некоторый итог по изученному материалу.
- Делегат представляет собой тип данных, аналогичный классу. Экземпляр делегата является специальным объектом, который может ссылаться на методы. При описании делегата используется
ключевое слово delegate, после которого указывается идентификатор типа результата метода, на который может ссылаться экземпляр делегата. Затем указывается имя делегата, и в круглых
скобках описываются аргументы. Такие аргументы должны быть у метода, на который ссылается экземпляр делегата.
- Создание экземпляра делегата напоминает создание обычного объекта. Объявляется переменная типа делегата, значением которой присваивается результат выражения на основе инструкции
new и имени делегата со ссылкой на метод в круглых скобках. Также можно присвоить значением переменной типа делегата ссылки на метод.
- Ссылка на нестатический метод выполняется так: указывается имя объекта и через точку - имя метода. Ссылка на статический метод выполняется указанием названия класса и (через точку) имени метода.
- Экземпляр делегата может ссылаться на несколько методов. Для добавления ссылки на метод (к уже существующим ссылкам в экземпляре делегата) используют оператор += (или
операторы = и +). Для удаления ссылки на метод из экземпляра делегата используют оператор -= (или операторы = и -).
- Экземпляр делегата можно вызывать. Для этого после имени экземпляра делегата (переменной, ссылающейся на экземпляр делегата) указываются круглые скобки и, если нужно, аргументы.
Тип и количество аргументов определяются тем, как объявлен делегат, экземпляр которого вызывается. При этом с соответствующими аргументами будут вызваны все методы, на которые ссылается
экземпляр делегата. Если вызываемые методы возвращают результат, то результатом выражения с вызовом экземпляра делегата является результат последнего вызванного метода.
- Анонимный метод представляет собой блок кода, определяющий метод и предназначенный для присваивания в качестве значения переменной типа делегата. Анонимный метод описывается так
же, как обычный метод, но идентификатор типа результата не указывается, а вместо названия метода указывается ключевое слово delegate. Тип результата анонимного метода определяется
типом результата, указанного в объявлении соответствующего делегата. Анонимный метод может содержать ссылки на внешние переменные.
- Лямбда-выражения представляют собой альтернативу анонимным методам. Лямбда-выражение определяет метод и предназначено для присваивания в качестве значения переменной делегата.
Лямбда-выражение описывается подобно анонимному методу, но только ключевое слово delegate не используется, а между круглыми скобками с аргументами и телом описания метода размещается
оператор =>. Существуют определенные правила, которые позволяют упростить синтаксис лямбда-выражений. Так, если аргумент один и его тип не указывается, то круглые скобки можно
не использовать. При единственной команде в теле метода фигурные скобки можно не использовать. Если в теле метода есть только одна команда с инструкцией return, то инструкцию return можно не указывать.
- Событие представляет собой автоматическое уведомление, посылаемое одним объектом прочим объектам. Событие реализуется с помощью специального члена класса. При объявлении события
обычно указывается спецификатор доступа public, затем ключевое слово event, делегат и название события. Делегат, указанный в объявлении события, определяет сигнатуру методов,
которые могут использоваться в качестве обработчиков события.
- Для добавления в список обработчиков события ссылок на методы или экземпляры делегатов используется оператор +=. Для удаления ссылок на методы и экземпляры делегатов из
списка обработчиков события используют оператор -=. Событие, как и экземпляр делегата, может быть вызвано (сгенерировано), но это можно сделать только в пределах кода класса. Для
генерирования события после имени события указываются круглые скобки с аргументами. Количество и тип аргументов определяются делегатом, указанным при объявлении события. При генерировании
события автоматически вызываются все методы и экземпляры делегата, зарегистрированные в качестве обработчиков для данного события.
- Хотя событие напоминает экземпляр делегата, между ними существует разница - примерно такая, как между свойством и полем. С каждым событием связано два метода-аксессора. При добавлении
(с помощью оператора +=) ссылки на метод в список обработчиков события вызывается add-аксессор. При удалении (с помощью метода -=) ссылки на метод из списка обработчиков
события вызывается remove-аксессор. Эти аксессоры можно описать в явном виде при объявлении события.
На следующем шаге мы рассмотрим несколько примеров программ, в которых используются делегаты и события.
Предыдущий шаг
Содержание
Следующий шаг