C#事件

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是从委托链表中移除委托实例。当订阅事件时只能用+=进行操作,注销事件则用-=;事件其实就是对委托的包装,以防止用户直接操作委托,产生不可预计的错误。事件可以用修饰方法的所有关键字进行声明,virtualstaticprotected……这样编译出的add_Xxxremove_Xxx方法就会和声明事件时用到关键字进行修饰。

C#中的事件,是对Observer,观察者模式的一个实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值