Ответ 1
Делегат в С# - это указатель на функцию типа с встроенным итератором.
Он гарантированно указывает на действительную функцию с указанной сигнатурой (в отличие от C, где указатели могут быть указаны, чтобы указать, кто знает что). Он также поддерживает концепцию итерации с помощью нескольких связанных функций.
В С# делегаты являются многоликим, они могут выполнять итерацию по нескольким функциям. Например:
class Program
{
delegate void Foo();
static void Main(string[] args)
{
Foo myDelegate = One;
myDelegate += Two;
myDelegate(); // Will call One then Two
}
static void One()
{
Console.WriteLine("In one..");
}
static void Two()
{
Console.WriteLine("In two..");
}
}