我正在阅读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/

10-10 21:35
查看更多