I was just browsing and came across this question:
The answer from nobug included this code:
protected virtual void OnLeave(EmployeeEventArgs e) {
var handler = Leave;
if (handler != null)
handler(this, e);
}
Resharper also generates similar code when using the “create raising method” quick-fix.
My question is, why is this line necessary?:
var handler = Leave;
Why is it better than writing this?:
protected virtual void OnLeave(EmployeeEventArgs e) {
if (Leave != null)
Leave(this, e);
}
It’s better because there is a tiny possibility that
Leavebecomes null after the null check, but before the invocation (which would cause your code to throw aNullReferenceException). Since the delegate type is immutable, if you first assign it to a variable this possibility goes away; your local copy will not be affected by any changes toLeaveafter the assignment.Note though that this approach also creates a issue in reverse; it means that there is a (tiny, but existing) possibility that an event handler gets invoked after it has been detached from the event. This scenario should of course be handled gracefully as well.