Use the Delegate Or Event ?

最初接触委托(Delegate)与事件(Event)时,始终对两者应用上不能做出较好的区分。只是事件自身是借助于委托实现的,那么如果委托足以应对大多数的需求,那么为什么引入事件呢?(Why Events)这样想来似乎陷入了“既生瑜,何生亮”的慨叹中...暂且打住,看看具体的事例情况吧:

    

// 发布事件的Clock类 Clock.cs

 

 

// 依赖于Clock并将订阅其事件的TimeBoard类 TimeBoard.cs

 

// 依赖Clock,也将订阅其事件的TimeWriter类 TimeWriter.cs

 

// 进行测试的主函数部分 Program.cs

 

(注意被注释掉的没有加上event 关键字声明的那一行) 如果只是应用delegate,对应看到Main函数中,当TimeWriter对象注册事件时,一旦误用了赋值操作符"=",而不是"+="添加方法到事件链中时会使在这之前已经注册的方法变成无效(被擦除了?),而这并非我们操作的本意。但以event 关键字进行声明后,编译器能自动检测出此处的误用,这正是event体现出的更好的封装性。

  

另外值得注意的一点是,如果最后Main函数中(最后一行的代码)clock似乎绕到了后方,开始直接调用自身对外公开的delegate,同时传入虚假的参数试图触发整个调用链。同样如果应用event代替delegate进行处理,此处的非法调用会被C#编译器侦查到,报告错误信息,提示调用出错。而这一点正是保证了委托所封装的方法只在发布事件的那一端得到触发时才真正被调用,隔绝了从外部调用的可能性。

 

最后以它们各自想表达的话语作结吧  :-)

Delegate 告诉另外的一个类“执行这个操作,做完后这个通知我”。Event 在一旁也说了“没有这么简单,我负责的这个delegate所封装的方法是专为个人处理而使用的:可以订阅/退订,而不可以直接调用”。

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值