注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一车,一房,一个温暖家

10万左右的车,80平方的房子,这是我奋斗的暖暖的家

 
 
 

日志

 
 

引用 c#中delegate和event之间的区别   

2015-06-22 22:29:22|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

c#中的delegate实现了observer模式,且是类型安全的,类似于Qt的signal/slot,给编程带来了很大的方便。在使用时一 直不明白event关键字的作用,查找visual studio 2005自带的msdn也未见结果,不知是不是vs 2005版本的原因。

曾经一度怀疑此event和内部消息循环中有关,即触发event只是发出消息,在当前的处理结束回到消息循环才能执行订阅了消息的函数。写了一个小程序测试后发现不是这样的,event触发后直接就跳到订阅消息的函数了。

下面是网上找到的几段话,阐述event和delegate的不同之处。

(1)

你不想在声明delegate的类之外调用delegate,还有,除了声明delegate的类,其它类只能订阅(Subscribe,即+=)或取消订阅(Unsubscribe,即-=)时就给delegate加个event关键字。  
   
  event和delegate谈不上什么区别不区别的。event就是delegate的一种应用。加上event关键字的delegate能做的事,所谓纯的delegate也完全能做到。  
   
  event就是某个类发生一些事情时,通知对该事件感兴趣的客户的一种手段。  
  不加event也可以达到效果。  
   
  加了event的delegate变量就当是它给外面的世界只显示了两个东西:+=、-=。  
  外面的世界既不能对他赋值(=操作),也不能调用它(myDelegate())。  
   
  还有一点.net   framework推荐使用了event关键字的delegate的原型最好类似delegate   void   MyEventHandler(object   sender,   MyEventHandler   e);这个样子。  
   
  声明了event   delegate的类变得更加有个性,他可以对其他人说:我自己有什么事儿时候再告诉你们,我告诉你们之前你们别烦我,也不用告诉我该做什么。发生事情的 时候我自己怎么处理是我自己的事,关你们屁事,事情发生了,我通知你们,你们怎么做是你们的事,做不做、怎么做也不管我的事。

(2)

事件是Observe(观察者)设计模式的一种实现,以多播委托为底层支持,事件的声明只负责发布以及它的两个注册方法(Add_EventName,Remove_EventName),可以参考.NET框架,上面讲的比较具体,事件体系结构可参考C#类设计手册

另外,补充一点:

事件模式要求所有的事件处理程序的返回类型都为void。必须这样做的原因是引发事件后可能要调用几个回调方法,因此不可能使每个回调方法都返回一个值。让返回类型为void就不会允许回调返回值。然而,在Microsoft.NET Framework类库中有一些事件处理程序,例如ResolveEventHandler,就没有遵守Microsoft自己规定的模式,因为ResolveEventHandler事件处理程序返回一个类型为Assembly的对象。


event 和 delegate 根本就是不同的东西,如何比较?
event 是 delegate 的容器而已, 可以 +=多个,也可以 -= 多个




  评论这张
 
阅读(9)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018