Обычно, чтобы избежать тестирования обработчика каждый раз (как показал Ed Guiness ), (IMHO) проще просто инициализировать событие с пустым делегатом, а затем вызвать его без проверки:
class Ball
{
// add an empty delegate to our handler
public event EventHandler BallInPlay = delegate { };
protected virtual void OnHit(EventArgs e)
{
// no need to check, we have at least one
// dummy delegate in the invocation list
BallInPlay (this, e);
}
}
На самом деле (хотя Джон Скит, вероятно, расскажет вам об этом до того, как я закончу писать этот пост :), единственный действительно безопасный поток событий - это вызов, обсуждаемый в статье Джона Скита .
Еще одна важная вещь, на которую следует обратить внимание, это то, что классы на самом деле не должны запускать события, которые находятся в других классах (т.е. метод OnHit
не должен быть public
). Если у класса есть публичное событие (например, BallClass
), оно должно быть тем, которое инициирует это событие.