事件(events)寻根(一)

昨天说到现在正在研读Jeffery Richter(后面简称JR)大师的《CLR via C#》聆听着大师透彻的说理,是一种享受。于是按部就班地顺次阅读,一直到第10章,终于遇到了真正的难点,这个难点就是事件(Events),确切地说是对事件实现的理解。

 

一、这个难点难在哪?

 

难在这里汇聚了太多的概念和太多的实现方法,毫不夸张地说,透彻理解了事件,相当于把C#中的核心知识点穿成了串。难度更在于事件的表面行为和背后的实现机制在.Net中得到了统一。回想一下从前学到的东西,高级的东西其实都这样:越高级就越易用,行为和实现的关系越难把握,代价是灵活性;反之,越底层,行为和实现的关系越直接,越灵活。

 

行为:理论根源是设计模式中的观察者,直接来源是UI中的事件驱动

 

实现:理论根源是函数调用中的回调机制,直接来源是C#中的委托

 

二、事件的概念是什么?

 

事件这个概念并不是.Net独创,如同属性(Properties)一样,机制由来已久,只是现在已经深刻地融入到.Net框架中来,并成为核心机制中不可缺少的一部分。所以我们第一步要做的是:理解事件的一般性定义。在我看到开始对事件作用的描述时,我的脑海里一下子闪现出来的是数据库中触发器(Triggers)的概念,这不就是事件吗?只不过在关系数据库里用存储过程作为实现方法而已。客户向服务端订阅通知,当服务端完成某项任务时,发出通知消息到客户,消息机制也可以叫异步响应,似乎和网络又有点相似之处。知识就是这样贯通的,只要理解了事件的概念,那在什么地方用都是一样的。

 

事件(events)寻根(一)

 

 客户向服务端订阅通知,当服务端完成某项任务时,发出通知消息到客户(《CLR via C#》2nd P226

 

三、真正的问题是什么?

 

那么在事件的一般性概念指引下,相信在C#中套用就不会有什么问题了。但会用从来都不是问题,C#本来就是极为简单的语法,目的就是为了让你直接用的。真正的问题是事件的实现,在我读到这里的时候,被完全卡住了,读了几遍还是一知半解,没有情绪进入下一章,索性直接跳到第15章,看看托管(Delegates)。JR在这一章的第一句话是这样的:“In this chapter, I talk about callback functions.” 接下来的一句又用了“extremely”这样的词极尽对这个callback functions的赞美。好吧,我承认我不知道什么是回调函数。

 

虽然只看了两句,但我想已经没有必要再往下看了,还是先了解回调函数吧!

转载于:https://www.cnblogs.com/atomlab/archive/2010/06/09/1755013.html