Joa*_*nge 11 .net c# delegates
我正在阅读Essential C#3.0书籍,我想知道这是否是检查代表为空的好方法?:
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 );
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果类型是不可变的,解决方案是否会更改?我认为可能具有不变性,你不会遇到这个线程问题.
Joh*_*don 12
关于这一点已经有很多讨论.
简而言之:即使执行此复制/检查null/execute步骤,也无法保证处理程序有效.
问题是,如果OnTemperatureChange在您复制它的时间和执行复制的时间之间取消注册,那么您可能无论如何都不希望执行侦听器.
您也可以这样做:
if (OnTemperatureChange != null )
{
OnTemperatureChange ( value );
}
Run Code Online (Sandbox Code Playgroud)
并处理空引用异常.
我有时会添加一个不执行任何操作的默认处理程序,只是为了防止空引用异常,但这会非常严重地增加性能影响,尤其是在没有注册其他处理程序的情况下.
我推荐Eric Lippert.
我的原始回复确实提到了使用默认处理程序,但我不建议使用临时变量,我现在也认为这是一个很好的做法,根据文章.
使用问号进行条件访问:
OnTemperatureChange?.Invoke();
| 归档时间: |
|
| 查看次数: |
31576 次 |
| 最近记录: |