在C#多播委托中使用多播

在C#多播委托中使用多播,c#,.net,delegates,multicastdelegate,C#,.net,Delegates,Multicastdelegate,在单播代理上使用多播代理何时有用 我经常使用委托,主要是与C#lambdas结合使用,但我从来没有感觉到使用C#delegate的多播方面的迫切性,即我从来没有想过将多个委托组合在一个委托中。因此,我很好奇在什么样的情况下多播委托是有用的——我只能想到一些例子,在这些例子中,您可以通过其他方式轻松实现功能,比如,链接委托或将其放入列表中 特别是Eric Lippert的回答给人的印象是,即使是C#团队有时也会忘记代理的多播性。事件是使用多播代理的一个主要例子。因此,可能在没有意识到的情况下,您每

在单播代理上使用多播代理何时有用

我经常使用委托,主要是与C#lambdas结合使用,但我从来没有感觉到使用C#delegate的多播方面的迫切性,即我从来没有想过将多个委托组合在一个委托中。因此,我很好奇在什么样的情况下多播委托是有用的——我只能想到一些例子,在这些例子中,您可以通过其他方式轻松实现功能,比如,链接委托或将其放入列表中


特别是Eric Lippert的回答给人的印象是,即使是C#团队有时也会忘记代理的多播性。

事件是使用多播代理的一个主要例子。因此,可能在没有意识到的情况下,您每天都在使用它们。

任何作为事件的操作都是这里的经典答案-那么调用方不需要知道谁在侦听(如果它不为null,只需调用它)。这非常理想,因为多个操作可以同时订阅-例如,观察视图模型上相同属性的3个单独控件(数据绑定)


委托作为函数(特别是带有返回值)的任何情况都是很棘手的,因为您需要考虑如何处理它-先考虑一下?最后?聚合?

我渴望有一天我可以忘记代表的多播。好吧,这激发了我的兴趣-有什么特别的原因吗?多播委托至少和单播委托一样难以实现,但这真的很糟糕,还是方差问题是一个坏内存?@Alex:我认为,在集合类型的世界中,多播委托根本没有必要。在我看来,没有理由认为两个委托的“和”是调用前两个委托的第三个委托。我更愿意将事件显式地实现为某种委托的集合。“多播代理”概念是.NET“概念计数”的不必要增加;没有它我们可以过得很好,如果你这样做,生活会大大简化。当然,我们现在还得忍受它们的怪癖。再说一次,MulticastDelegate将代理目标存储在一个列表中:)@Eric,通过同一个“接口”启动单个/多个代理的执行肯定是有用的,因为没有更好的词。或者(在假设的替代方案中)你会保留糖吗?使用外部化collections的好处是允许您更改多播行为(在异常/排序/编辑时),但您仍然希望默认情况下做“正确的正常事情”。我讨厌java每次都强迫您实现多播(在微妙的边缘情况下通常会出现半随机散布的bug),看起来多播代理应该根据法律返回void。向委托添加多个非OID函数应引发异常。我的O'Reilly书中说“last”函数是使用其返回值的函数,但这似乎毫无用处且容易出现错误。@MarkLakata如果调用方想要所有单独的返回,可以使用GetInvocationList。您提到的所有内容也可以应用于
ref
/
out
参数,或者应用于每次调用之间可变常规参数的状态-这里复杂的不仅仅是返回值。坦白地说,我很满意它的“原样”…@MarkLakata语言规范还说委托调用的返回值是列表中最后一个方法的返回值。Quote:如果委托调用包括输出参数或返回值,则它们的最终值将来自对列表中最后一个委托的调用。