Search code examples
c#.netevents

Does an event need to have at least one handler?


Why event needs to have at least one handler?

I created custom event for my Control and somewhere inside of code of my control, I call this event:

this.MyCustomEvent(this, someArgs);

it throws a NullReferenceException if there is no handler subscribed to it.

When I added a single handler in control's constructor, everything works fine:

this.MyCustomEvent += myCutomEventHandler;

void myCustomEventHandler(object sender, EventArgs e)
{ /* do nothing */ }

Is this normal or maybe I'm doing something wrong? Shouldn't it check automatically if there are any handlers subscribed? It's a little dumb, IMHO.


Solution

  • Note that delegates are reference types, and their default value is null.

    The solution proposed by others, i.e. to check for null before firing the event, is not thread-safe because listeners may unsubscribe from the event between the null check and the firing of the event. I have seen solutions that involve copying the delegate to a local variable, and checking it for null before firing, such as

    EventHandler myCustomEventCopy = MyCustomEvent;
    
    if (myCustomEventCopy != null)
    {
        myCustomEventCopy (this, someArgs);
    }
    

    But this has a race-condition, i.e. handlers may fire even after they have unsubscribed from the event, which may corrupt the state of the application.

    One solution that handles both problems is to initialize events to a blank handler, e.g.

    public event EventHandler MyCustomEvent = delegate { };
    

    and then fire them off without any checks, e.g.

    MyCustomEvent(this, someArgs);
    

    Edit: As others have pointed out, this is a complex issue.

    Link

    Lippert points out that completely removing the "handler is fired after deregistration" problem requires that the handlers themselves are written in a robust manner.