If it's a field-like event, it will use simple delegate combination as per Delegate.Combine
, and that is guaranteed to preserve subscription order. From the docs for the return value:
A new delegate with an invocation list that concatenates the invocation lists of a and b in that order.
In general for events, nothing is guaranteed - it's up to the implementation. Heck, it could ignore every subscription you ever make. In reality though, any sane implementation will preserve ordering.
EDIT: Sample of a mischievous event implementation:
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!");
}
}
This is just like writing a property which (say) returns a random number from the getter and ignores the value in the setter. It's more of a theoretical problem than a real one.