Как известно, правильно вызывать событие надо приблизительно так:
mutable e = MyEvent;
unless (e is null) e(sender, args);
Почему бы не добавить в стандартную библиотеку макрос RaiseEvent, который делал бы за нас грязную работу?
RaiseEvent(evt, sender, args) /* -------> */ { mutable _N_100500 = evt; unless (evt is null) evt(sender, args); }
Кроме того, неплохо добавить и стандартную реализацию OnMyEvent для событий:
[Raise] public event MyEvent : Handler;
/* раскрывается в */
protected OnMyEvent(args : EventArgs) : void
{
RaiseEvent(MyEvent, this, args);
}
Ну и для полного счастья, аксесоры с событиями:
[EventAccessor] _myField : string;
// создает свойство MyField, событие MyFieldChanged, и метод OnMyFieldChanged