Прежде чем начать разбираться, обратимся к официальному определению.
Делегат — это тип, который представляет ссылки на методы с определенным списком параметров и типом возвращаемого значения. При создании экземпляра делегата этот экземпляр можно связать с любым методом с совместимой сигнатурой и типом возвращаемого значения. Метод можно вызвать (активировать) с помощью экземпляра делегата.
Объявление делегата
public delegate int PerformCalculation(int x, int y); public delegate void PerformCalculation();
Какие значения принимают делегаты?
Делегаты могут принимать любые методы из любого доступного класса. Метод должен быть статичным или быть методом экземпляра. Использование делегатов позволяет изменять программно методы и включать новый код в существующие классы.
Методы передаваемые в делегат должны иметь идентичные типы входящих параметров и возвращаемых значений. Это значит, что в делегат, возвращающий тип INT, мы не можем передать метод, возвращающий FLOAT.
ПРИМЕР:
using System; class Calc { public int Add(int a, int b) { int result = a + b; return result; } public int AddThree(int a, int b, int c) { int result = a + b + c; return result; } public float Division(int a, int b) { float result = a / b; return result; } } class Program { public delegate int Operation(int x, int y); static void Main() { Calc calc = new Calc(); Operation operation; operation = calc.Add;//ПРАВИЛЬНО operation = calc.AddThree; //ОШИБКА! Больше параметров // чем в делегате operation = calc.Division;//ОШИБКА! Возвращаемый тип не // соответствует типу делегата Console.WriteLine("result=" + operation(3,4).ToString()); } }