处理事件.从当地变种开始饲养

本文关键字:开始 变种 处理事件 | 更新日期: 2023-09-27 17:59:54

关于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在无效性检查之后但在调用之前变为null的可能性。如果你有:

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

当你已经进入"if"正文时,最后一个监听器被取消订阅,你会得到一个NullReferenceException

这是因为,在为事件null检查和调用之间,可能有东西取消了订阅,使事件成为null,这将抛出一个(可能未处理)NullReferenceException,这至少会让用户感到恼火。