Все о делегатах C#

Делегат для методов экземпляра / объекта

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

Синтаксис:
[атрибут] модификатор_доступа delegate тип имя_делегата ([список_параметров]);

    using System;
     
    public delegate int dlgSum(int arg0, int arg1);
    public delegate void dlgTextShow();
     
    class One {
     //метод, который будет вызывать объект делегата
     public int Sum(int arg0, int arg1) {
      return (arg0 + arg1);
     }
     //метод, который будет вызывать объект делегата
     public void TextShow() {
      Console.WriteLine("Привет Мир!");
     }
    }
     
    class Program {
     public static int Main() {
       
      /*должен быть создан объект класса, в котором объявлен метод,
      на который будет ссылаться объект делегата*/
      One O = new One();
       
      //инициализация делегата, создание объекта и его привязка к методу
      //ВНИМАНИЕ! указывается только имя метода, БЕЗ СКОБОК
      dlgSum dS = new dlgSum(O.Sum);
     
      //реализация объекта делегата
      //обратите ВНИМАНИЕ, к объекту делегата добавляются круглые скобки, как у метода
      Console.WriteLine(dS(10, 20));
     
      dlgTextShow dTS = new dlgTextShow(O.TextShow);
      dTS();
       
      Console.ReadKey();
      return 0;
     }
    }
30 Привет Мир! 

Применения делегат со статическими методами

    using System;
     
    public delegate int dlgSum(int arg0, int arg1);
    public delegate void dlgTextShow();
     
    class One {
     //метод, который будет вызывать объект делегата
     public static int Sum(int arg0, int arg1) {
      return (arg0 + arg1);
     }
     //метод, который будет вызывать объект делегата
     public static void TextShow() {
      Console.WriteLine("Привет Мир!");
     }
    }
     
    class Program {
     public static int Main() {
       
      //инициализация делегата, создание объекта и его привязка к методу
      //ВНИМАНИЕ! указывается только имя метода, БЕЗ СКОБОК
      dlgSum dS = new dlgSum(One.Sum);
     
      //реализация объекта делегата
      //обратите ВНИМАНИЕ, к объекту делегата добавляются круглые скобки, как у метода
      Console.WriteLine(dS(10, 20));
     
      dlgTextShow dTS = new dlgTextShow(One.TextShow);
      dTS();
       
      Console.ReadKey();
      return 0;
     }
    }
30
Привет Мир! 

Применения делегат для именованных методов

    using System;
     
    public delegate int dlgSum(int arg0, int arg1);
    public delegate void dlgTextShow();
     
    class One {
     //метод, который будет вызывать объект делегата
     public int Sum(int arg0, int arg1) {
      return (arg0 + arg1);
     }
     //метод, который будет вызывать объект делегата
     public void TextShow() {
      Console.WriteLine("Привет Мир!");
     }
    }
     
    class Program {
     public static int Main() {
     
      /*должен быть создан объект класса, в котором объявлен метод,
      на который будет ссылаться объект делегата*/
      One O = new One();
     
      //инициализация делегата, создание объекта и его привязка к методу
      //ВНИМАНИЕ! указывается только имя метода, БЕЗ СКОБОК
      //обратите ВНИМАНИЕ! объект не создается
      dlgSum dS = O.Sum;
     
      //реализация объекта делегата
      //обратите ВНИМАНИЕ, к объекту делегата добавляются круглые скобки, как у метода
      Console.WriteLine(dS(10, 20));
     
      dlgTextShow dTS = O.TextShow;
      dTS();
       
      Console.ReadKey();
      return 0;
     }
    }
30
Привет Мир! 

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

    using System;
     
    public delegate int dlgSum(int arg0, int arg1);
    public delegate void dlgTextShow();
     
    //обратите ВНИМАНИЕ, класс вообще ОТСУТСТВУЕТ
     
    class Program {
     public static int Main() {
     
      //создание анонимного метода
      //ВНИМАНИЕ! в конце метода ставится точка с запятой
      dlgSum dS = delegate(int arg0, int arg1) {
       return (arg0 + arg1);
      };
     
      //реализация объекта делегата
      //обратите ВНИМАНИЕ, к объекту делегата добавляются круглые скобки, как у метода
      Console.WriteLine(dS(10, 20));
     
      dlgTextShow dTS = delegate() {
       Console.WriteLine("Привет Мир!");
      };
      dTS();
       
      Console.ReadKey();
      return 0;
     }
    }
30
Привет Мир!

Применение делегатов с лямбда выражениями.

    using System;
     
    public delegate int dlgSum(int arg0, int arg1);
    public delegate void dlgMessage(string arg);
    public delegate void dlgTextShow();
     
    //обратите ВНИМАНИЕ, класс вообще ОТСУТСТВУЕТ
     
    class Program {
     public static int Main() {
     
      //создание анонимного метода
      //ВНИМАНИЕ! в конце метода ставится точка с запятой
      //1 вариант
      dlgSum dS1 = (int arg0, int arg1) => {
       return (arg0 + arg1);
      };
      //2 вариант
      dlgSum dS2 = (int arg0, int arg1) => (arg0 + arg1);
      //3 вариант
      dlgSum dS3 = (int arg0, int arg1) => arg0 + arg1;
     
      //реализация объекта делегата
      //обратите ВНИМАНИЕ, к объекту делегата добавляются круглые скобки, как у метода
      Console.WriteLine(dS1(10, 20));
     
      //обратите ВНИМАНИЕ, если метод имеет один параметр, 
      //то его не обязательно брать в круглые скобки
      dlgMessage dM = arg => Console.WriteLine(arg);
      dM("Hello World!");
       
      //обратите ВНИМАНИЕ, если метод не имеет параметров
      dlgTextShow dTS = () => Console.WriteLine("Привет Мир!");
      dTS();
       
      Console.ReadKey();
      return 0;
     }
    }
30
Hello World!
Привет Мир! 

Многоадресная передача

Многоадресная передача — это способность создавать список вызовов методов, которые должны автоматически вызываться при вызове делегата.
Создается экземпляр делегата, а затем для добавления методов в эту цепочку используется оператор «+=», а для удаления из цепочки вызовов используется оператор «-=».
Делегат многоадресной передачи имеет одно ограничение — он должен возвращать тип void.

    using System;
     
    //для многоадресной передачи делегат должен иметь тип void
    public delegate void dlgMessage();
     
    //обратите ВНИМАНИЕ, класс вообще отсутствует
     
    class Program {
     public static int Main() {
     
      dlgMessage dM0 = null;
      dlgMessage dM1 = () => Console.Write("New York");
      dlgMessage dM2 = () => Console.Write(" is");
      dlgMessage dM3 = () => Console.Write(" a");
      dlgMessage dM4 = () => Console.Write(" big");
      dlgMessage dM5 = () => Console.Write(" city");
      //помещаем объекты в массив
      dlgMessage[] arra = new dlgMessage[] {dM1, dM2, dM3, dM4, dM5};
      for(int i=0; i<arra.Length; i++) {
       //добавление в цепочку вызова делегатов
       dM0 += arra[i];
      }
      dM0();
      Console.WriteLine();
      Console.WriteLine();
      //удаление из цепочки вызова делегата вручную
      dM0 -= dM5;
      dM0();
      Console.WriteLine();
      dM0 -= dM4;
      dM0();
      Console.WriteLine();
      dM0 -= dM3;
      dM0();
      Console.WriteLine();
      dM0 -= dM2;
      dM0();
      Console.WriteLine();
      Console.ReadKey();
      return 0;
     }
    }
New York is a big city

New York is a big
New York is a
New York is
New York 
Обновлено: 26.12.2019 — 21:06

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

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

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