9

私は少し新しいc#ので、些細なことだと思ったら見落としてください。次の「奇妙な」コードを見ました。

誰かがそれに少し光を当てることができますか?

public event Action _action;

if (_action != null)            
{
    foreach (Action c in _action.GetInvocationList())
    {
         _action -= c;
    }
}

特にその_action -= c;部分。

4

4 に答える 4

23

デリゲートは、複数の関数のデリゲートになることができます。alphaに委任するデリゲートAlpha()と、次にbeta委任するデリゲートがある場合、 Beta()thengamma = alpha + beta;を呼び出すデリゲートです。 を呼び出すデリゲートを生成します。率直に言って、これは少し奇妙な機能です。Alpha()Beta()gamma - betaAlpha()

あなたが投稿したコードは奇妙です。それは、「実行中の関数のリストを調べて、ますます少ない関数を呼び出すデリゲートの山全体を生成し、最後に何もしないデリゲートを に割り当てactionます。一体なぜ誰もがこれを行うのでしょうか?単に割り当てnullaction完了します。それと。

于 2013-03-13T17:52:51.507 に答える
6
public event Action _action; //an event


if (_action != null) // are there any subscribers?

{
        foreach (Action c in _action.GetInvocationList()) //get each subscriber
        {
            _action -= c; //remove its subscription to the event
        }
}
于 2013-03-13T17:51:27.280 に答える
3

アクションのハンドラーを削除しています。

于 2013-03-13T17:49:43.040 に答える
2

イベントは実際にはMultiCastDelegateです。イベントハンドラーを「アタッチ」すると、そのハンドラーへの参照が追加されますInvocationList

上記のコードは、イベント内の各イベントハンドラーをイベントInvocationListから切り離しています。つまり、イベントを「クリア」します。これは、と言うことでも実行できます_action = null

于 2013-03-13T17:52:19.800 に答える