Raise an event (sample 1)
I'm bringing your code in line with C#3, which is about 8 years old, so hopefully can be used by your audience. By and large, it's making the class Listener static because it contains no state, using EventHandler&lt;T&gt; to create an event handler rather than using a custom delegate and using var to declare local variables with. I also added some vertical spacing so the code could breathe. The class 'RaiseArgs' is now immutable since the state should remain the same after creation. I like having classes sealed unless my design requires them not to be (it prevents them from being inherited). And lastly, I used a thread-safe access to the event by copying it to a local variable and comparing to null. And now the code:

using System;

// program that managers publisher and listener
public static class Program
{
    // subscribe to event, raise event
    public static void Main()
    {
        // new publisher
        var publisher = new Publisher();

        // subscribe to event
        Listener.Subscribe(publisher);

        // raise event
        publisher.RaiseEvent();
    }
}

// object with the event
public sealed class Publisher
{
    // declare event
    public event EventHandler&lt;RaiseArgs&gt; Event;

    // raise event, result: "hello"
    public void RaiseEvent()
    {
        var handler = Event;

        if (handler != null)
        {
            var args = new RaiseArgs("hello");

            handler(this, args);
        }
    }
}

// object that listens for the event
public static class Listener
{
    // subscribe to event
    public static void Subscribe(Publisher publisher)
    {
        publisher.Event += HeardEvent;
    }

    private static void HeardEvent(object sender, RaiseArgs e)
    {
        Console.WriteLine(e.Message);
    }
}

// the arguments to use with an event
public sealed class RaiseArgs : EventArgs
{
    private readonly string _Message;

    public RaiseArgs(string message)
    {
        _Message = message;
    }

    public string Message
    {
        get
        {
            return _Message;
        }
    }
}