Как правило, модель события, встроенная в язык, будет достаточной для модели наблюдателя. На самом деле нет никакой причины реализовывать его по-другому, поскольку вы просто воссоздаете события.
Как говорится, бывают редкие случаи, когда люди меняют "стандартный" шаблон событий. Например, я видел случаи, когда люди хотят вызывать события асинхронно. Обычно я не рекомендую это (лично я думаю, что это лучше обрабатывать на стороне подписчика), но это все еще может быть обработано с помощью стандартного события C #, но повышение события немного меняется (с использованием GetInvocationList и асинхронного вызова делегатов) .