Я бы поддержал ответ @Jon Hanna, но подчеркну тот факт, что .Net-события реализуют обычно используемый шаблон (Observer) с достаточной элегантностью, так что в большинстве случаев это просто извращение, чтобы реализовать его любым другим способом.
Это демонстрируется тем, как события возникают в самих классах .Net Framework, а не просто в качестве языковой конструкции для программистов приложений. Это первоклассная языковая функция, и поэтому сознательно избегать их использования не имеет смысла. Это все равно, что избегать циклов foreach
только потому, что есть другие способы достижения той же цели.
Смотрите здесь для обзора Шаблон наблюдателя и как события обращаются к этому в .Net . Маловероятно, что все, что вы создадите с использованием других методов программирования .Net, будет соответствовать простоте и выразительности реализации event
.