Delegate C# Tutorial

using System;
using System.Collections.Generic;
using System.Text;
delegate void NameChangedDelegate(string name, string newValue);
class Program
{
    static void Main(string[] args)
    {
        Employee c = new Employee();
        Subscriber s1 = new Subscriber(c, "subscriber-A");
        Subscriber s2 = new Subscriber(c, "subscriber-B");
        Subscriber s3 = new Subscriber(c, "subscriber-C");
        c.FirstName = "F";
        s2.Unsubscribe();
        c.FirstName = "A";
    }
}
class Subscriber
{
    public string SubscriberID = "new subscriber";
    public Employee myEmployee = null;
    public NameChangedDelegate ncDel = null;
    public Subscriber(Employee c, string subId)
    {
        SubscriberID = subId;
        ncDel = new NameChangedDelegate(myEmployee_OnNameChanged);
        myEmployee = c;
        myEmployee.OnNameChanged += ncDel;
    }
    void myEmployee_OnNameChanged(string name, string newValue)
    {
        Console.WriteLine("[{0}] Employee {1} changed to {2}.", SubscriberID,
            name, newValue);
    }
    public void Unsubscribe()
    {
        myEmployee.OnNameChanged -= ncDel;
    }
}
class Employee
{
    private string firstName;
    private event NameChangedDelegate onNameChange;
    public event NameChangedDelegate OnNameChanged
    {
        add
        {
            onNameChange += value;
            if (value.Target is Subscriber)
            {
                Console.WriteLine("Subscriber '{0}' just subscribed to OnNameChanged.",
                    ((Subscriber)value.Target).SubscriberID);
            }
        }
        remove
        {
            onNameChange -= value;
            if (value.Target is Subscriber)
            {
                Console.WriteLine("Subscriber '{0}' just un-subscribed from OnNameChanged.",
                    ((Subscriber)value.Target).SubscriberID);
            }
        }
    }
    public string FirstName
    {
        get { return firstName; }
        set
        {
            firstName = value;
            onNameChange("firstname", value);
        }
    }
}