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

イベントのローカル コピー (ティックと終了) を作成し、それを介してイベントを発生させる理由は何ですか?

nullity チェックの、呼び出しの前にTicknull になる可能性を回避します。あなたが持っていた場合:

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

...そして、「if」ボディにすでに入っているときに最後のリスナーのサブスクライブが解除された場合、NullReferenceException.

于 2013-02-16T17:00:48.680 に答える
0

これは、イベントを null チェックしてから呼び出されるまでの間に、何かがサブスクライブを解除し、 event を作成してnull(おそらく unhandled) をスローしNullReferenceException、控えめに言ってもユーザーにとって迷惑になるためです。

于 2013-02-16T17:02:10.713 に答える