Делегат для методов экземпляра / объекта
Делегат — это тип ссылки, который хранит данные о сигнатуре метода.
Делегат — это объект, который ссылается на метод.
Объект делегата может вызывать разные методы во время выполнения, а не во время компиляции.
Синтаксис:
[атрибут] модификатор_доступа 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