Делегаты в C#
Для того чтобы воспользоваться делегатом, необходимо создать его экземпляр и задать имена методов, на которые он будет ссылаться. При вызове экземпляра делегата вызываются все заданные в нем методы. Использование делегата имеет тот же синтаксис, что и вызов метода. Если делегат хранит ссылки на несколько методов, они вызываются последовательно в том порядке, в котором были добавлены в делегат… Читать ещё >
Делегаты в C# (реферат, курсовая, диплом, контрольная)
Делегат — это вид класса, предназначенный для хранения ссылок на методы. Делегат, как и любой другой класс, можно передать в качестве параметра, а затем вызвать инкапсулированный в нем метод. Делегаты используются для поддержки событий, а также как самостоятельная конструкция языка. Рассмотрим сначала второй случай.
Описание делегатов
Описание делегата задает сигнатуру методов, которые могут быть вызваны с его помощью:
[атрибуты] [спецификаторы] delegate ([параметры]).
Спецификаторы делегата имеют тот же смысл, что и для класса, причем допускаются только спецификаторы new, public, protected, internal и private. Тип описывает возвращаемое значение методов, вызываемых с помощью делегата, а необязательными параметрами делегата являются параметры этих методов. Делегат может хранить ссылки на несколько методов и вызывать их поочередно, естественно, что сигнатуры всех методов должны совпадать.
Пример описания делегата: public delegate void Dd (int i);
Здесь описан тип делегата, который может хранить ссылки на методы, возвращающие void и принимающие один параметр целого типа.
Делегат, как и всякий класс, представляет собой тип данных. Его базовым классом является класс System. Delegate. Наследовать от делегата нельзя.
Объявление делегата можно размещать непосредственно в пространстве имен или внутри класса.
Использование делегатов
Для того чтобы воспользоваться делегатом, необходимо создать его экземпляр и задать имена методов, на которые он будет ссылаться. При вызове экземпляра делегата вызываются все заданные в нем методы.
Делегаты применяются в основном для следующих целей:
- · получения возможности определять вызываемый метод не при компиляции, а динамически во время выполнения программы;
- · обеспечения связи между объектами по типу «источник — наблюдатель»;
- · создания универсальных методов, в которые можно передавать другие методы;
- · поддержки механизма обратных вызовов.
Использование делегата имеет тот же синтаксис, что и вызов метода. Если делегат хранит ссылки на несколько методов, они вызываются последовательно в том порядке, в котором были добавлены в делегат.
Добавление метода в список выполняется либо с помощью метода Combine, унаследованного от класса System. Delegate, либо, что удобнее, с помощью перегруженной операции сложения.
При вызове последовательности методов с помощью делегата необходимо учитывать следующее:
- · сигнатура методов должна в точности соответствовать делегату;
- · методы могут быть как статическими, так и обычными методами класса;
- · каждому методу в списке передается один и тот же набор параметров;
- · если параметр передается по ссылке, изменения параметра в одном методе отразятся на его значении при вызове следующего метода;
- · если параметр передается с ключевым словом out или метод возвращает значение. Результатом выполнения делегата является значение, сформированное последним из методов списка (в связи с этим рекомендуется формировать списки только из делегатов, имеющих возвращаемое значение типа voi d);
- · если в процессе работы метода возникло исключение, не обработанное в том же методе, последующие методы в списке не выполняются, а происходит поиск обработчиков в объемлющих делегат блоках;
- · попытка вызвать делегат, в списке которого нет ни одного метода, вызывает генерацию исключения System. Null Ref erenceExcepti on.