Nebudu psát o tom co jsou to delegáti a události v C#, ale shrnu jejich podobné a rozdílné rysy.

Kus zdrojového kódu bude výřečnější než já :)

C#:
namespace EventVsDelegate
{
    public delegate void MyEventHandler(String message);

    class MyClass
    {
        //událost
        public event MyEventHandler MyEventA;
       
        //událost přidává k delegátovi přístupové metody add a remove,
        //které je možné využít k implementaci vlastního úložiště události
        public event MyEventHandler MyEventB
        {
            add
            {
                _myEventStorage += value;
            }
            remove
            {
                _myEventStorage -= value;
            }
        }

        //úložiště události
        private MyEventHandler _myEventStorage;

        //pouhý delegát
        public MyEventHandler MyDelegate;

       
        public void RaiseEvents()
        {
            if (MyEventA != null)
            {
                MyEventA("Event A");
            }

            if (_myEventStorage != null)
            {
                _myEventStorage("Event B");
            }

            if (MyDelegate != null)
            {
                MyDelegate("Delegate");
            }
            //tady se události a delegáti volali podobně
        }
    }
}

C#:
namespace EventVsDelegate
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.MyEventA += HandlerA;
            mc.MyEventA += HandlerB;
            mc.MyDelegate += HandlerA;
            mc.MyDelegate += HandlerB;
            mc.RaiseEvents();
            //zatím to vypadalo že delegáti a události se používají stejně

            //Události můžeme volat pouze ze třídy, ve které byly deklarované.
            //Nelze je volat ani z odvozené třídy.
            //následující řádek by tedy nešel přeložit
            //mc.MyEventA("Progam");

            // volání delegáta je omezeno pouze modifikátory přístupu
            mc.MyDelegate("Program");

            //do události nemůžeme nic přiřadit pomocí "rovná se", (+=, -= je samozřejmě v pohodě)
            //následující řádek by tedy nešel přeložit
            //mc.MyEventA = null;
            mc.MyDelegate = null;
           
            mc.RaiseEvents();
            Console.ReadKey();
        }

        public static void HandlerA(String message)
        {
            Console.WriteLine("Handler A - "+message);
        }

        public static void HandlerB(String message)
        {
            Console.WriteLine("Hadnler B - "+message);
        }

    }
}

C#:
interface MyInterface
    {
        event MyEventHandler MyEventA;
        //delegát nemůže být definován v rozhraní
        //následující řádek by nešel přeložit
        //MyEventHandler MyEventB;
    }

Ze zdrojových kódů by mělo vyplynout, že klíčové slovo event přidává k delegátovi několik omezení (nemožnost přiřadit pomocí = ; nemožnost volat odjinut než ze třídy, kde je deklarován) a několik nových možností (využít přístupové metody add a remove; definovat událost v rozhraní).