c# - 确保 C# 中的多播委托(delegate)执行列表顺序?

标签 c# .net events invocation

经过一些阅读,我了解到处理程序的调用顺序与订阅的顺序相同,但不能保证。

假设我有:

public event MYDEl ev;

订阅者会这样做:

ev+=GetPaper;
ev+=Print;
ev+=EjectPaper;

保留+确保执行列表顺序的最佳实践机制是什么?

最佳答案

如果它是类似字段的事件,它将根据 Delegate.Combine 使用简单的委托(delegate)组合,并且保证保留订阅顺序。来自返回值的文档:

A new delegate with an invocation list that concatenates the invocation lists of a and b in that order.

一般对于事件,没有什么是可以保证的——这取决于实现。哎呀,它可能会忽略你所做的每一个订阅。但实际上,任何理智的实现都会保留顺序。

编辑:恶作剧事件实现示例:

public class BadEventPublisher
{
    public event EventHandler Evil
    {
        add { Console.WriteLine("Mwahahaha!"); }
        remove { }
    }

    protected virtual void OnEvil(EventArgs e)
    {
        Console.WriteLine("Who cares? Subscriptions are ignored!");
    }
}

这就像编写一个属性(比方说)从 getter 返回一个随机数并忽略 setter 中的值。这与其说是一个实际问题,不如说是一个理论问题。

关于c# - 确保 C# 中的多播委托(delegate)执行列表顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13759841/

相关文章:

c# 在不停止应用程序的情况下读取用户输入

c# - 在 CultureInfo 中获取当前语言

c# - 我怎样才能获得对属性 setter 的引用?

c# - 非委托(delegate)类型的事件

c# - Mimekit/mailkit 下载邮件正文?

c# - 如何在 C# 中使用正则表达式解析 OData $filter?

c# - 解决编译器错误 CS1519 : Invalid token ',' in class, 结构或接口(interface)成员声明

c# - 部署 IE9 扩展

php - 如何在 Phalcon PHP 中访问 SecurityPlugin (Acl) 中的模型数据?

javascript - 如何在 NodeJS 中观察各个级别的变量变化