Примеры с делегатами в C#

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

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

Как видите, объявление типа делегата, отчасти, похоже на объявление метода, но в самом начале, указывается ключевое слово delegate, а после списка аргументов, нет тела как у метода, вместо которого ставит символ «;».

Обратите внимание, объект-делегат может ссылаться только на такие методы, чья сигнатура (список параметров и тип возвращаемого значения, в данном контексте) полностью совпадает с объявлением типа этого делегата. Но ссылаться делегат может как на статические, так и на обычные методы классов.

Пример:

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

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

Давайте сразу рассмотрим фрагмент кода, в котором представлено объявление типа делегатов и класс, описывающий объекты-коллекции:

В начале программы объявляется тип делегатов DoubleOperation, делегаты такого типа ссылаются на методы, принимающие один аргумент типа double и возвращающие значение такого же типа. В классе DoubleCollection объявляется поле operation, которое является ссылкой на делегат, типа DoubleOperationЗначение полю operation задается через свойство Operation . Рассмотрим подробнее код метода DoOperation:

В данном методе, перебираются все элементы коллекции, и над каждым выполняется вызов метода, на который ссылается делегат operation .

Пользователю класса DoubleCollection нужно просто позаботиться о создании метода SomeOperation  который мог бы делать и какие-то другие действия.

 

Обновлено: 25.10.2018 — 12:03

2 комментария

Оставить комментарий
  1. НикитаЖе

    Всем привет друзья. Я не понял. Зачем Мне делегать чтобы вызвать два разных статических метода разница и сумма. В чем проблема взять и не вызвать метод и передать туда нужные параметры?

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.