8

阅读文档我可以看到+运算符可用于组合/组合相同类型的委托。

以同样的方式,我可以看到我可以使用-运算符从组合委托中删除 a 。

我还注意到该Action类型具有静态CombineRemove方法,可用于连接两个委托的调用列表,并分别从另一个委托的调用列表中删除委托的调用列表的最后一次出现。

        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- 所以我应该通过使用 Remove 来避免这种情况吗?

4

1 回答 1

12

The delegate operators (+ and -) are shorthand for the static methods.
There is no difference at all.

a += b compiles to a = (Action)Delegate.Combine(a, b)

于 2013-01-07T14:26:46.113 回答