Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firing an event in C# with no attatched delegate methods?

I've just encountered a bug in the program I'm writing where an exception was thrown stating an "object reference must be set to an instance of an object". Upon investigation, I found that this exception was thrown when trying to fire an event BUT the event didn't have any delegate methods added to it.

I wanted to check that my understanding was correct that as a developer you shouldn't fire events without first checking that the event doesn't equal null? For example:

if (this.MyEventThatIWantToFire != null)
{
    this.MyEventThatIWantToFire();
}

Thanks in advance for the advice/thoughts.

like image 205
James Bedford Avatar asked Feb 11 '11 14:02

James Bedford


1 Answers

The pattern you've shown is broken in a multi-threaded environment. MyEventThatIWantToFire could become null after the test but before the invocation. Here's a safer approach:

EventHandler handler = MyEventThatIWantToFire;
if (handler != null)
{
    handler(...);
}

Note that unless you use some sort of memory barrier, there's no guarantee you'll see the latest set of subscribers, even ignoring the obvious race condition.

But yes, unless you know that it will be non-null, you need to perform a check or use a helper method to do the check for you.

One way of making sure there's always a subscriber is to add a no-op subscriber yourself, e.g.

public event EventHandler MyEventThatIWantToFire = delegate {};

Of course, events don't have to be implemented with simple delegate fields. For example, you could have an event backed by a List<EventHandler> instead, using an empty list to start with. That would be quite unusual though.

An event itself is never null, because the event itself is just a pair of methods (add/remove). See my article about events and delegates for more details.

like image 89
Jon Skeet Avatar answered Oct 04 '22 23:10

Jon Skeet