Волшебства нет, код, скрытый под RaiseEvent, делает именно то, что вы ожидаете, он перебирает коллекцию обработчиков и выполняет каждый из них.
Затраты на проверку наличия каких-либо обработчиков тривиальны, не беспокойтесь об этом.
Если ваш REAL вопрос: «Чтобы сэкономить время, я должен проверить, что события имеют обработчики, прежде чем вызывать события?» , , , тогда ответ «Нет», вы ничего не получите от этого.
Кроме того, не беспокойтесь об оптимизации, если вам не нужно (см. Эту запись в Википедии , чтобы узнать почему.)
Re: Звонок GetMystring()
.
Да, это связано с тем, как вы вызываете события в C #, где вы проверяете наличие обработчиков перед тем, как вызывать событие.
E.g.:
if (MyEvent != null)
MyEvent(GetMyString())
Кстати, хороший эксперимент:)