在c#中组合多播委托——我应该使用操作符还是Action.Combine ?

本文关键字:操作符 Combine Action 我应该 组合 多播 | 更新日期: 2023-09-27 17:50:51

阅读文档,我可以看到+操作符可以用来组合/组合相同类型的委托。

同样,我可以看到我可以使用-操作符从组合委托中删除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来避免这种情况吗?

在c#中组合多播委托——我应该使用操作符还是Action.Combine ?

委托操作符(+-)是静态方法的简写。
根本没有区别。

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