Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_Pris.doc
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
987.65 Кб
Скачать
  1. C#. Делегаты. События.

Делегат – тип, поддерживающий механизм функций обратного вызова.

Экземпляры этого типа являются оболочками методов других типов.

 обеспечивают безопасность типов

 поддерживают вызов статических и экземплярных методов

цепочка делегатов — набор делегатов, который позволяет вызвать все методы,

представленные делегатами набора

Начнем с определения термина делегат (delegate). Делегат — это объект, который

может ссылаться на метод. Таким образом, создавая делегат, вы по сути создаете объект, который может содержать ссылку на метод. Более того, этот метод можно вызвать

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

на который он ссылается.

На первый взгляд идея ссылки на метод может показаться странной, поскольку

обычно мы имеем дело с ссылками, которые указывают на объекты, но в действительности здесь разница небольшая. Как разъяснялось выше, ссылка по существу

представляет собой адрес памяти. Следовательно, ссылка на объект — это адрес объекта. Даже несмотря на то что метод не является объектом, он тоже имеет отношение к физической области памяти, а адрес его точки входа — это адрес, к которому происходит обращение при вызове метода. Этот адрес можно присвоить делегату. Если уж делегат ссылается на метод, этот метод можно вызвать посредством данного делегата.

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

Делегат объявляется с помощью ключевого слова delegate. Общая форма объявления делегата имеет следующий вид:

delegate тип_возврата имя(список_параметров);

Здесь элемент тип_возврата представляет собой тип значений, возвращаемых методами, которые этот делегат будет вызывать. Имя делегата указывается элементом имя. Параметры, принимаемые методами, которые вызываются посредством делегата, задаются с помощью элемента список_параметров. Делегат может вызывать только такие методы, у которых тип возвращаемого значения и список параметров (т.е. его сигнатура) совпадают с соответствующими элементами объявления делегата.

Делегат может вызывать либо метод экземпляра класса, связанный с объектом, или

статический метод, связанный с классом.

Примеры:

internal delegate void FooCallback(int value)

public delegate int BarCallback(int [] anArray)

Во-первых, делегаты обеспечивают поддержку функционирования событий.

Во-вторых, делегаты позволяют во время выполнения программы выполнить метод,

который точно не известен в период компиляции. Эта возможность особенно полезна, когда нужно создать оболочку, к которой могли бы подключаться программные

компоненты.

На основе делегатов построено еще одно важное средство С#: событие (event). Событие — это по сути автоматическое уведомление о выполнении некоторого действия.

События работают следующим образом. Объект, которому необходима информация о

некотором событии, регистрирует обработчик для этого события. Когда ожидаемое

событие происходит, вызываются все зарегистрированные обработчики. А теперь

внимание: обработчики событий представляются делегатами.

События — это члены класса, которые объявляются с использованием ключевого

слова event. Наиболее распространенная форма объявления события имеет следующий вид:

event событийный_делегат объект;

Здесь элемент событийный_делегат означает имя делегата, используемого для

поддержки объявляемого события, а элемент объект — это имя создаваемого собы-

тийного объекта.

Событие – член типа, позволяющий типу уведомлять другие объекты о наступлении

некоторого события Механизм событий основан на делегатах.

Если в типе определен член-событие, то этот тип (или его экземпляр) может

уведомлять другие объекты о некоторых особых событиях. Скажем, класс Button

(«кнопка») определяет событие Click («щелчок»). В приложении могут быть объекты,

которые должны получать уведомление о щелчке объекта Button, а получив такое

уведомление — исполнять некоторые действия. События — это члены типа,

обеспечивающие такого рода взаимодействие. Тип, в котором определены события, как

минимум поддерживает:

 регистрацию статического метода типа или экземплярного метода объекта,

заинтересованных в получении уведомления о событии;

 отмену регистрации статического метода типа или экземплярного метода

объекта, получающих уведомления о событии;

 уведомление зарегистрированных методов о том, что событие произошло.

Типы могут предоставлять эту функциональность при определении событий,

так как они поддерживают список зарегистрированных методов. Когда событие

происходит, тип уведомляет об этом все зарегистрированные методы.

Модель событий CLR основана на делегатах (delegate). Делегаты позволяют

обращаться к методам обратного вызова (callback method), не нарушая

безопасности типов. Метод обратного вызова — это механизм, позволяющий объекту

получать уведомления, на которые он подписался.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]