2

私はこの方法を持っています:

public override void respond(params string[] resargs)
{
    foreach (command cmd in pndgcmds)
    {
        cmd(this);
    }

    if (objs[resargs[0]].status)
        objs[resargs[0]].request(resargs);
    else
    {
        pndgcmds.Add(
            (myclass master) =>
            {
                if (master.objs[resargs[0]].status != true) return;
                master.objs[resargs[0]].request(resargs);
                //code to remove the delegate
            });
    }
}

これは、オブジェクトが応答できるかどうかをチェックし、応答できる場合は応答させます。そうでない場合は、コマンドをディクショナリに格納して、次に応答が呼び出されたときにステータスがチェックされて呼び出されるようにします。

2つの質問があります。

  1. デリゲートを削除するコードを作成するにはどうすればよいですか?どうすればいいのかわかりません。

  2. ご覧のとおり、デリゲートの内部動作の多くはメソッドパラメーターに依存しています。代理人はどのように行動しますか?

前もって感謝します!

4

1 に答える 1

6

captire-context のインスタンスはそれを作成するときにしか利用できないため、匿名メソッドは削除するのが面倒です。 が必要です。幸いなことに、トリックがあります。

SomeDelegateType handler = null;
handler = (myclass master) =>
            {
                if (master.objs[resargs[0]].status != true) return;
                master.objs[resargs[0]].request(resargs);
                pndgcmds.Remove(handler);
            };
pndgcmds.Add(handler);

これは現在、自己サブスクライブ解除ハンドラーであり、呼び出されると自分自身をサブスクライブ解除します。これを行うには、デリゲート インスタンス ( handler) を格納する必要がありますが、その変数に対してクロージャーを作成することに注意してください。イニシャル=nullは明確な割り当ての要件です。

resargs変数もキャプチャされることに注意してください。これは、インデックス ゼロの値がサブスクリプションの後、呼び出される前に変更されると、混乱を招く可能性があります。「今」という値を使用したい場合は、代わりにそれを閉じます。

SomeDelegateType handler = null;
string val = resargs[0];
handler = (myclass master) =>
            {
                if (master.objs[val].status != true) return;
                master.objs[val].request(resargs);
                pndgcmds.Remove(handler);
            };
pndgcmds.Add(handler);
于 2012-09-02T11:41:41.680 に答える