I was reading the Essential C# 3.0 book and am wondering if this is a good way to check delegates for null?:
class Thermostat
{
public delegate void Temperat
First, you aren't actually publishing an event - so at the moment, your code is "at risk" of people messing it up completely. It should be:
public event TemperatureChangeHandler CurrentTemperatureChanged;
The name "CurrentTemperatureChanged" is important for data-binding (there is a convention that the runtime uses - given a property Foo, it will look for FooChanged). However, IMO this should just be regular EventHandler
. Data-binding will look for EventHandler
, but more importantly: you aren't actually giving any information in the event that the subscriber can't already get just by looking at obj.CurrentTemperature
.
I'll give the rest of the answer in terms of TemperatureChangeHandler
, but I would encourage you (again) to switch to EventHandler
:
public event EventHandler CurrentTemperatureChanged;
The approach:
TemperatureChangeHandler handler = CurrentTemperatureChanged;
if(handler != null) handler(value);
is reasonable, but (as per other replies) there is a slim risk of callers that think they disconnected getting the event. Unlikely in reality.
Another approach is an extension method:
public static class TemperatureChangeExt {
public static void SafeInvoke(this TemperatureChangeHandler handler,
float newTemperature) {
if (handler != null) handler(newTemperature);
}
}
Then in your class you can just use:
if (currentTemperature != value) {
currentTemperature = value;
CurrentTemperatureChanged.SafeInvoke(value);
}