C#中的事件其实并不难理解,它只是委托的一个包装器而已。例如我在上篇文章中的例子:
public delegate void SimpleDelegate();
public class SmimpleTest
{
public event SimpleDelegate NewEvent;
}
当在SmimpleTest类中定义一个事件,编译器编译这行代码时,会将
public event SimpleDelegate NewEvent;这行代码编译成这样的形式:
private SimpleDelegate NewEvent;
[MethodImpl(MethodImplOptions.Synchronized)]
public void add_NewEvent(SimpleDelegate value)
{
this.NewEvent = (SimpleDelegate) Delegate.Combine(this.NewEvent, value);
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void remove_NewEvent(SimpleDelegate value)
{
this.NewEvent = (SimpleDelegate) Delegate.Remove(this.NewEvent, value);
}
这里事件被编译成了一个私有的委托字段,并且还生成两个和事件访问级别一样的方法,add_NewEvent方法是将委托实例添加到委托链表中,remove_NewEvent是从委托链表中移除委托实例。当订阅事件时只能用+=进行操作,注销事件则用-=;事件其实就是对委托的包装,以防止用户直接操作委托,产生不可预计的错误。事件可以用修饰方法的所有关键字进行声明,virtual,static,protected……这样编译出的add_Xxx和remove_Xxx方法就会和声明事件时用到关键字进行修饰。
C#中的事件,是对Observer,观察者模式的一个实现。