Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中组合多播委托-我应该使用运算符还是Action.Combine?_C#_Delegates_Accessor - Fatal编程技术网

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

在C#中组合多播委托-我应该使用运算符还是Action.Combine?,c#,delegates,accessor,C#,Delegates,Accessor,通过阅读文档,我可以看到+操作符可用于组合/组合相同类型的委托 同样,我可以看到,我可以使用-操作符从组合委托中删除 我还注意到,Action类型具有静态的Combine和Remove方法,可用于连接两个委托的调用列表,并分别从另一个委托的调用列表中删除委托的调用列表的最后一次出现 Action a = () => Debug.WriteLine("Invoke a"); Action b = () => Debug.WriteLine("Invoke

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

同样,我可以看到,我可以使用
-
操作符从组合委托中删除

我还注意到,
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行中看到警告
说明
委托减法有不可预测的结果
-那么我应该使用Remove来避免这种情况吗?

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


a+=b
编译为
a=(动作)委托。Combine(a,b)
显然,静态方法返回一个新委托,而访问器没有
错误“委托减法有不可预测的结果”是一个重新精简的警告,而且似乎措词不当。结果完全可以预测。它们是在C#规范中定义的。但是,对于一些用户来说,他们的代理减法心智模型不符合规范,因此结果对他们来说是“不可预测的”。@SLaks-你能进一步解释吗
a+=b
不会返回新的
Delegate
,而
Delegate.Combine(a,b)
显然会返回。@mike z-是的,这有点精神…哈…@Fraser:错了
a+=b
a=a+b
的缩写(就像任何其他
+=
添加的内容一样),它显然会返回一个新的委托。(注意,事件完全不同)非常感谢-真正让我困惑的是,
a+=b
a
保留为type
Action
Delegate.Combine(a,b)
返回一个
Delegate
类型,而不是
Action
类型…@Fraser:如果你查看生成的IL,您将在
委托之后看到
castclass
指令。(您可以在LINQPad中看到这一点)…因此-访问器不返回
委托
类型,它们返回与所组成的两个对象类型相同的对象(在本例中为
操作
),而静态方法始终返回
委托
。我想我只是说了“delegate”而不是键入
delegate
@Fraser(注意它们被称为操作符,而不是访问器)就把这个问题弄糊涂了。运算符执行与方法完全相同的操作;静态方法也返回与其操作数相同的类型。啊,是的。。。这是我使用的
委托。合并
。。。而不是动作。结合扔我的
。很抱歉给你带来了困惑。