В принципе я объяснил бы это вот так:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleTemp
{
public delegate void MyDelegate();
class Program
{
static void Running()
{
Console.WriteLine("Runing");
}
static void RunDelegate(MyDelegate dlg)
{
dlg();
}
static void Main(string[] args)
{
MyDelegate dlg = new MyDelegate(Running);
RunDelegate(dlg);
RunDelegate(Running);
}
}
}
Вспомнив, что делегат- аналог указателя на функцию в С++ решил состряпать этот пример. Сработал. Просто вспомнил работу с указателем на функцию. В метод можно было передать как указатель на функцию, так и саму функцию напрямую. Аналогия сработала.
Об остальном можно только предполагать, т.к. реализация делегатов от нас скрыта.
Ну естественно, что по факту передается указатель на функцию.
Ну и как ответ на твой первый вопрос - для события по барабану как ты напишешь, потому как все это тонкости работы делегата.