关于c#:
的书中有关事件的章节中有代码示例class CountDown
{
private uint _seconds;
public CountDown(uint seconds)
{
_seconds = seconds;
}
public void Start()
{
new Thread(() =>
{
uint n = _seconds;
while (n > 0u)
{
var tick = Tick; ///??????
if (tick != null)
tick(n);
Thread.Sleep(1000);
n--;
}
var finished = Finished; ///??????
if (finished != null)
finished();
}).Start();
}
}
public event Action<uint> Tick;
public event Action Finished;
创建事件的本地副本(tick和finished)以及通过它创建事件的原因是什么?这是常见做法还有一定道理吗?我尝试了,但无法从书中得到它。
答案 0 :(得分:3)
创建事件的本地副本(tick和finished)以及通过它创建事件的原因是什么?
它避免了Tick
在无效检查后变为空而在呼叫之前的可能性。如果你有:
if (Tick != null)
{
Tick(n);
}
...当你已经进入“如果”身体时,最终的听众被取消订阅,你会得到NullReferenceException
。
答案 1 :(得分:0)
这是因为,在你对事件进行null检查和被调用之间,有些东西可能已经取消订阅,使得事件null
会抛出一个(可能是未处理的)NullReferenceException
,这会让人烦恼对用户来说,至少可以这么说。