3

デリゲート呼び出しが次のように実行されるコード例をよく見ました。

`

    public delegate void DelegateThreadActivity<T, U> (T sender, U e);

    public event DelegateThreadActivity<Thread, System.EventArgs> OnStart = null;
    public event DelegateThreadActivity<Thread, System.EventArgs> OnStop = null;

    // Helper method for invocation.
    public void RaiseOnStart ()
    {
        DelegateThreadActivity<Thread, System.EventArgs> instance = null;

        try
        {
            instance = this.OnStart;
            // OR
            instance = (DelegateThreadActivity) (object) this.OnStart;

            if (instance != null)
            {
                instance(this, System.EventArgs.Empty);
            }
        }
        catch
        {
        }
    }

`

なぜ[instance]オブジェクトを使用するのですか?最初は企業の慣習だと思っていましたが、経験豊富な開発者もこれを行っています。メリットは何ですか?

4

1 に答える 1

6

これは、スレッドセーフと、デリゲートが回転した場合の例外発生の防止のために行われますnull

このコードを考えてみましょう:

if (this.OnStart != null)
{
  this.OnStart(this, System.EventArgs.Empty);
}

の実行との実行の間ifthis.OnStartOnStartデリゲートが操作された可能性があります(おそらく、に変更さnullれ、例外が発生します)。

質問で提供したフォームで、デリゲートのコピーが作成され、実行時に使用されます。元のデリゲートでの変更はコピーに反映されないため、例外が発生しなくなります。ただし、これには欠点があります。その間に変更がコピーに反映されないため、非null状態も含まれるため、呼び出し元の代理人がすでに削除されているか、最近追加された呼び出し元の代理人が呼び出されません。

于 2012-05-06T01:52:46.600 に答える