Typically, an event model embedded in the language will be sufficient for the observer pattern. In fact, there is no reason to implement it differently, since you are simply recreating events.
Saying, there are rare times when people change the "standard" pattern of events. For example, I have seen cases where people want to raise events asynchronously. I usually do not recommend this (I personally think that this is handled better on the subscriber side), but it can still be handled using the standard C # event, but the event raise is slightly changed (using GetInvocationList and delegate asynchronous call).
source share