8

ドキュメントを読むと、+演算子を使用して同じタイプのデリゲートを作成/結合できることがわかります。

-同じように、演算子を使用して、構成されたデリゲートからを削除できることがわかります。

また、この型には、2つのデリゲートの呼び出しリストを連結し、あるデリゲートの呼び出しリストの最後のオカレンスを別のデリゲートの呼び出しリストから削除するために使用できるAction静的メソッドCombineとメソッドがあることに気付きました。Remove

        Action a = () => Debug.WriteLine("Invoke a");
        Action b = () => Debug.WriteLine("Invoke b");
        a += b;
        a.Invoke(); 

        //Invoke a
        //Invoke b

        Action c = () => Debug.WriteLine("Invoke c");
        Action d = () => Debug.WriteLine("Invoke d");
        Action e = Action.Combine(c, d);
        e.Invoke();

        //Invoke c
        //Invoke d

        a -= b;
        a.Invoke();

        //Invoke a

        e = Action.Remove(e, d);
        e.Invoke(); 

        //Invoke c

それらは、呼び出しリストから結合/削除する方法に関して同じ結果を生成するように見えます。

SOのさまざまな例や他のコードで使用されている両方の方法を見てきました。どちらか一方を使うべき理由はありますか?落とし穴はありますか?たとえば、次の行に警告が表示されa -= b;ますDelegate subtraction has unpredictable results。削除を使用してこれを回避する必要がありますか?

4

1 に答える 1

12

デリゲート演算子(+および-)は、静的メソッドの省略形です。
まったく違いはありません。

a += bにコンパイルしますa = (Action)Delegate.Combine(a, b)

于 2013-01-07T14:26:46.113 に答える