我正在阅读Essential C#3.0书籍,想知道这是否是检查委托(delegate)是否为null的好方法?:
class Thermostat
{
public delegate void TemperatureChangeHandler ( float newTemperature );
public TemperatureChangeHandler OnTemperatureChange { get; set; }
float currentTemperature;
public float CurrentTemperature
{
get { return this.currentTemperature; }
set
{
if ( currentTemperature != value )
{
currentTemperature = value;
TemperatureChangeHandler handler = OnTemperatureChange;
if ( handler != null )
{
handler ( value );
}
}
}
}
}
如果类型是不可变的,解决方案是否会改变?我认为也许具有不变性,您不会遇到此线程问题。
最佳答案
原始(有些不准确)响应:
对此进行了很多讨论。
简而言之:即使执行此复制/检查是否为空/执行步骤,也不能保证处理程序将有效。
问题是,如果在您复制OnTemperatureChange到执行复制之间未注册OnTemperatureChange,则可能确实是您无论如何都不希望执行该监听器。
您也可以这样做:
if (OnTemperatureChange != null )
{
OnTemperatureChange ( value );
}
并处理一个空引用异常。有时,我添加了一个不执行任何操作的默认处理程序,只是为了防止null引用异常,但这会严重影响性能,尤其是在没有其他处理程序注册的情况下。
更新2014-07-10:
我服从Eric Lippert。
我最初的回答确实暗示了使用默认处理程序,但是我不建议使用temp变量,根据本文,我现在也同意将其作为一种好习惯。
关于c# - 检查代表是否为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/972932/