Некоторые вещи, которые нужно учитывать ...
В .NET есть EventHandler<T> where T : EventArgs
, но компромисс заключается в том, что вы в конечном итоге пишете пользовательские EventArgs для передачи ваших двойных данных вместо пользовательского делегата. Тем не менее, я думаю, что это более чистая модель.
Если бы вы определили ваше событие как
public static MyEventHandler EventComplete = delegate {};
//using a no-op handler like this has implications on Garbage Collection
Предотвращает ли GC использование лямбда-выражения no-op для инициализации события?
Вы можете сохранять каждый раз проверку if (EventComplete! = Null) и, следовательно, делать метод Invoke ... избыточным.
Вы также можете упростить
MyClass.EventComplete += new MyClass.EventCompleteHandler(MyClass_EventComplete);
to
MyClass.EventComplete += MyClass_EventComplete;
Кроме того, все выглядит хорошо. Я предполагаю, что все static
вокруг кода только от работы в ConsoleApplication: -)