5

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

所以可以说我有:

public event MYDEl ev;

和订户做:

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

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

4

1 回答 1

11

如果是类字段事件,它将使用简单的委托组合Delegate.Combine,并且保证保持订阅顺​​序。从返回值的文档中:

具有调用列表的新委托,该列表按该顺序连接 a 和 b 的调用列表。

一般来说,对于事件,没有任何保证——这取决于实施。哎呀,它可能会忽略您所做的每一次订阅。但实际上,任何合理的实现都会保留顺序。

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

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 中的值。这更像是一个理论问题而不是实际问题。

于 2012-12-07T09:08:05.330 回答