与事件合作。从当地变量上升

时间:2013-02-16 16:58:49

标签: c# .net events

关于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)以及通过它创建事件的原因是什么?这是常见做法还有一定道理吗?我尝试了,但无法从书中得到它。

2 个答案:

答案 0 :(得分:3)

  

创建事件的本地副本(tick和finished)以及通过它创建事件的原因是什么?

它避免了Tick在无效检查后变为空而在呼叫之前的可能性。如果你有:

if (Tick != null)
{
    Tick(n);
}

...当你已经进入“如果”身体时,最终的听众被取消订阅,你会得到NullReferenceException

答案 1 :(得分:0)

这是因为,在你对事件进行null检查和被调用之间,有些东西可能已经取消订阅,使得事件null会抛出一个(可能是未处理的)NullReferenceException,这会让人烦恼对用户来说,至少可以这么说。