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?
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With