Делегаты
Делегаты в C # аналогичны указателям на функции в C ++ — они представляют собой переменные, в которых хранятся ссылки на методы. Делегаты могут хранить ссылки на любой метод с одним и тем же типом возвращаемого значения и параметрами.
В делегатах, указывающих на методы с немного разными типами сигнатур, допускается некоторое расхождение. Сюда могут входить типы, которые являются предками или унаследованы от типов в сигнатурах типов делегата.
Переменные делегата также могут быть множественными. Переменные делегата с множественным приведением вызывают одну функцию за другой. Оператор +
используется для функций с множественным приведением, а -
используется для удаления функции из списка выполнения переменных с множественным приведением.
Использование
В следующем примере показано, как используются делегаты.
using System; class DelegateExample {//Делегаты определили публичный делегат int delFunc (int num); публичный делегат void delFunc2 (); общедоступный статический int doubleNum (int num) {return num + num; } общедоступный статический int squareNum (int num) {return num * num; } public static void function1 () {Console.Write ("Привет,"); } public static void function2 () {Console.Write ("Мир!"); } static void Main () {//Объявленные переменные-делегаты delFunc fun1 = new delFunc (doubleNum); delFunc fun2 = новый delFunc (squareNum); delFunc2 multiFun; //Переменная делегата с многоадресной трансляцией multiFun = new delFunc2 (function1); multiFun + = новый delFunc2 (function2); //Вызов doubleNum (3) с использованием делегата Console.WriteLine (fun1 (3)); //Вызов squareNum (3) с использованием делегата Console.WriteLine (fun2 (3)); //Вызов function1 (), а затем function2 () с использованием делегата multiFun (); }}
В этом примере два делегата, delFunc
и delFunc2
определены. delFunc
принимает целое число в качестве параметра и возвращает целое число. delFunc2
не принимает параметров и ничего не возвращает.
Два метода с совпадающими сигнатурами (с delFunc
, doubleNum
и squareNum
) определены, на которые ссылаются переменные делегата fun1
и fun2
, а затем вызываются используя эти переменные.
Аналогичным образом определяются две функции, соответствующие delFunc2
, function1
и function2
. Переменная делегата delFunc2
инициализируется, многоадресно передается для вызова function1
и function2
, а затем используется для вызова этих функций. Этот вызов выводит: «Hello, World!» в терминал, используя «Hello» в function1
и «World!» в function2
.