Что такое делегаты и для чего они нужны?

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

Описание делегата задает сигнатуру методов, которые могут быть вызваны с его помощью:

[ атрибуты ] [ спецификаторы ] delegate тип имя_делегата ( [ параметры ] )

Спецификаторы делегата имеют тот же смысл, что и для класса, причем допускаются только спецификаторы new, public, protected, internal и private.

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

Примерописанияделегата:

public delegate void D ( int i ):

Здесь описан тип делегата, который может хранить ссылки на методы, возвращающие void и принимающие один параметр целого типа.

Объявление делегата можно размещать непосредственно в пространстве имен или внутри класса.

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

Делегаты применяются в основном для следующих целей:

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

• а динамически во время выполнения программы;

• обеспечения связи между объектами по типу «источник — наблюдатель»;

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

• поддержки механизма обратных вызовов.

Использование делегата имеет тот же синтаксис, что и вызов метода. Дели делегат хранит ссылки нанесколько методов, они вызываются последовательно в томпорядке, в котором были добавлены в делегат.

Добавление метода в список выполняется либо с помощью метода Combine, унаследованного от класса System.Delegate, либо, что удобнее, с помощью перегруженной операции сложения.

При вызове последовательности методов с помощью делегата необходимо учитывать

следующее;

• сигнатура методов должна в точности соответствовать делегату;

• методы могут быть как статическими, так и обычными методами класса;

• каждому методу в списке передается один и тот же набор параметров;

• если параметр передается по ссылке, изменения параметра в одном методе отразятся

• на его значении при вызове следующего метода;

• если параметр передается с ключевым словом out или метод возвращает значение, результатом выполнения делегата является значение, сформированное последним из методов списка (в связи с этим рекомендуется формировать списки только из делегатов, имеющих возвращаемое значение типа void);

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

• попытка вызвать делегат, в списке которого нет ни одного метода, вызывает генерацию исключения System.NullReferenceException.

Рассмотрим применение делегатов для обеспечения связи между объектами по типу «источник — наблюдатель». В результате разбиения системы на множество совместно работающих классов появляется необходимость поддерживать согласованное состояние взаимосвязанных объектов. При этом желательно избежать жесткой связанности классов, так как это часто негативно сказывается на возможности многократного использования кода.

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

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

Наши рекомендации