在C#中组合多播委托 - 我应该使用运算符还是Action.Combine?

Fra*_*ser 7 c# delegates accessor

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

以同样的方式,我可以看到我可以使用-运算符从组合委托中删除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
Run Code Online (Sandbox Code Playgroud)

它们在调用列表中如何组合/删除时似乎产生相同的结果.

我已经看到在SO和其他代码中的各种示例中使用的两种方式.有什么理由我应该使用这种或那种方式吗?坑坑洼洼吗?例如-我可以看到线警告a -= b;指出Delegate subtraction has unpredictable results-所以我应该通过移除避免这种情况?

SLa*_*aks 10

委托运算符(+-)是静态方法的简写.
完全没有区别.

a += b 编译成 a = (Action)Delegate.Combine(a, b)

  • @Fraser:如果你看一下生成的IL,你会在`Delegate.Combine`之后看到`+ =`的`castclass`指令.(你可以在LINQPad中看到这个) (2认同)