Делегат для методов экземпляра / объекта
Делегат — это тип ссылки, который хранит данные о сигнатуре метода.
Делегат — это объект, который ссылается на метод.
Объект делегата может вызывать разные методы во время выполнения, а не во время компиляции.
Синтаксис:
[атрибут] модификатор_доступа delegate тип имя_делегата ([список_параметров]);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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; } } |
1 |
30 Привет Мир! |
Применения делегат со статическими методами
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
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; } } |
1 2 |
30 Привет Мир! |
Применения делегат для именованных методов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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; } } |
1 2 |
30 Привет Мир! |
Применения делегат с анонимными методами
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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; } } |
1 2 |
30 Привет Мир! |
Применение делегатов с лямбда выражениями.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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; } } |
1 2 3 |
30 Hello World! Привет Мир! |
Многоадресная передача
Многоадресная передача — это способность создавать список вызовов методов, которые должны автоматически вызываться при вызове делегата.
Создается экземпляр делегата, а затем для добавления методов в эту цепочку используется оператор «+=», а для удаления из цепочки вызовов используется оператор «-=».
Делегат многоадресной передачи имеет одно ограничение — он должен возвращать тип void.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
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; } } |
1 2 3 4 5 6 |
New York is a big city New York is a big New York is a New York is New York |