在做了一些阅读后,我理解处理程序调用顺序与订阅的顺序相同,但不能保证。
所以我想说:
public event MYDEl ev;
和订阅者:
ev+=GetPaper;
ev+=Print;
ev+=EjectPaper;
保留+确保执行列表顺序的最佳实践机制是什么?
答案 0 :(得分:9)
如果它是类似字段的事件,它将根据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中的值。这更像是一个理论问题,而不是一个真正的问题。