Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Event declaration with assignment to empty delegate

Tags:

c#

I have question on a piece of code I often stumble across online. For example

  public static event Action<Foo> foo = delegate{  };

I got the left hand side of the declaration. But the right hand side is confusing. What is the point in assigning the event to a delegate with empty parenthesis?

like image 533
user1527762 Avatar asked Dec 21 '22 08:12

user1527762


2 Answers

UPDATE: in modern versions of C#, the recommended pattern to use is to leave it as null and use the ?. operator:

event Action<Foo> foo; // leave it as null as the default
// ...
foo?.(new Foo());

In older versions of C#, the reason for this pattern could be that the default value of an event field is null. This requires the use of a null-check every-time you want to raise the event - calling foo() on an uninitialised event field would result in a NullReferenceException. It's more convenient to just give it a sensible default value like a no-op, that way you can raise the event directly without having to use a wrapper method or anything.

like image 85
millimoose Avatar answered Jan 08 '23 18:01

millimoose


The default value of a delegate member is null, so if you don't assign anything to it, it will throw a NullReferenceException when you attempt to call it. You can easily see how this could be a problem: imagine if you had to subscribe to OnKeyDown on every control!

Handily, events in the standard library are guarded, which does an equivalent thing:

Event handler = OnClick
if (handler != null)
    handler(this, new EventArgs());

This is the form I'd recommend, as - to me anyway - it looks cleaner. Also, note the use of a local variable. It is legal to write it as

if(OnClick != null) OnClick(this, new EventArgs()); 

but that isn't threadsafe, as the listener to OnClick could unsubscribe between the null check and the call.

like image 35
RoadieRich Avatar answered Jan 08 '23 18:01

RoadieRich