Это зависит от издателя события, но обычно будет зависеть от того, какой обработчик был добавлен к событию первым. Это реализация по умолчанию для события, которое в основном реализуется с использованием делегата. Так, например:
SomeDelegate eventHandlers = null;
eventHandlers += FirstHandler;
eventHandlers += SecondHandler;
eventHandlers(...);
Это определенно вызовет FirstHandler
до SecondHandler
. Однако нет никакой гарантии, что событие будет реализовано только с использованием таких делегатов.
РЕДАКТИРОВАТЬ: в то время как поведение обработки событий зависит от издателя событий, часть комбинации делегатов точно указана в спецификации языка C #, раздел 7.8.4:
[...] В противном случае результатом операции является новый экземпляр делегата, который при вызове вызывает первый операнд, а затем вызывает второй операнд.
Метод BCL Delegate.Combine
дает аналогичную гарантию (выделено мной):
(Возвращаемое значение) Новый делегат со списком вызовов, который объединяет списки вызовов a и b в указанном порядке . Возвращает a, если b равно нулю, возвращает b, если a является нулевой ссылкой, и возвращает нулевую ссылку, если a и b являются нулевыми ссылками.