1

在关于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;

创建事件的本地副本(勾选和完成)并通过它引发事件的原因是什么?这是常见的做法并且有一定的意义吗?我试过,但无法从书中得到它。

4

2 回答 2

3

创建事件的本地副本(勾选和完成)并通过它引发事件的原因是什么?

它避免了在无效检查之后调用之前Tick变为 null的可能性。如果你有:

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

...当你已经进入“if”正文时,最后一个听众被取消订阅,你会得到一个NullReferenceException.

于 2013-02-16T17:00:48.680 回答
0

这是因为,在您对事件进行空检查和调用它之间,可能会取消订阅某些内容,从而使事件发生null,这将引发 (可能未处理) NullReferenceException,这至少会让用户感到烦恼。

于 2013-02-16T17:02:10.713 回答