当前位置:编程学习 > C#/ASP.NET >>

.Net事件个人探索后的总结(在C#语言下)

C#事件的个人理解
                         ------详细总结准备在我现在的项目完成后做一个大总结
最近在开发一个项目,其中要在业务处理过程中把一些重要的操作以日志的形式记录下来(其中包括windows 日志写入,txt文本写入,xml写入,数据库写入),所以我想到了用事件来处理这些问题。已是再一次对.Net的事件进行了研究,找了很多书,都没没完全看懂,主要是各中书,对事件,事件源,事件发送方和事件接收方的描述有些出入,没有发现有统一的描述,因而就有了不同的理解,造成对.Net事件无法深入理解,很难去驾驽它(不能充分的使用它的特性),后来我决定看看MSDN对事件的描述和使用,终于在夜深人静的时候,我明白了事件的处理原理和处理的过程,有了茅塞顿开的感觉,以是怕给忘,借此跟大家共享一下的我对.Net事件处理流程和原理的理解。以下是我对事件的概念理解
1. 什么是事件:
1.一般这么描述:一个特定处理功能的信号;(个人认为有点抽象,初入门者如容易理解)
2.C#高级编程(第六版李铭翻译的)的描述:这里的事件有两种不同的含义。第一,表现发生了某件有趣的事情;第二,表现c#语言中已定义的一个对象,即处理通知过程的对象(个人认为这个跟抽象,我无法从中得到领悟,反而把之前的理解前搞乱了,也不知道我的大脑咋想的,当时很是郁闷)
3.MSDN的描述:以发信号通知操作的发生.(这个我认为不是很抽象,至少没给我造成混淆以前的概念)
4.由于打字的速度实在不行,其他书上的描述就不说了
5.我的理解:事件就是我们常说的“通知”,这里我它想象成了“政府行政的通知“,
  从“通知”这两个词概念,我们是比较容易理解事件是个什么东西了,具体的事件例如什么鼠标单击事件,鼠标双击事件,就可以理解为政府的“免个人税通知”和“春节放15天假的通知”。这样我们对整个事件的理解过程就完成了,其实就是一个从一般都特殊的过程,这时再看第一条对事件一般的描述,就很容易理解它的含义了
2. 什么是事件的发送方:
引发事件的对象(其中包含对事件的声明,引发调用外部函数的委托和引发的方法,类似.Net中的Button类),一般的书上没有这样的描述,我走了很多弯路和迂回路才得到这样的理解。这里我也把它理解成了发通知的政府部门(其中事件的声明即政府部门草拟的通知文件,引发调用外部函数的委托就是政府部门要委托哪个下属部门去公布这个通知的过程),引发的方法就是调用外部函数的方法
3. 什么是事件的接收方
捕获事件并对其作出响应的对象。(有些书上描述为事件订阅器,事件侦听器)
事件的接收方包含处理事件的方法,当然这个方法不能随便定义,必须要跟发送方引发调用外部函数的委托的签名一致(即函数的返回值和函数的参数类型保持一致)
一般是我们自定义的类。
4. 什么事件源:引发事件方的类的对象,例如我们常使用点击按钮事件中的sender变量
即Button1_Clicked(object sender,EventArgs e)方法中sender变量,其中sender是由发送方发过来的
5. 什么是事件数据:包含该事件的详细信息,通常是一个类。例如我们常使用点击按钮事  件中的e变量即Button1_Clicked(object sender,EventArgs e)方法中e变量,
其中e是由发送方发过来的
6. 事件的功能:借用MSDN的描述,觉得描述比较好,所有把他copy下来作为一个小题。
1. 包括事件数据类
2. 事件的委托
3. 引发事件的类
7. 事件发送方与事件接受方的关系
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件,所需要的是在源和接收方之间存在一个媒介(或类似指针函数的机制,本人理解为委托)
相信大家如果是从上往下读和理解的下来的话,对该描述是比较容易理解的(该描述为MSDN提供的),如果还是不太理解话,那请看我下面的图,希望别再有不理解的地方了(不知这样csdn能不能把图传上去)
 [img=http://g1a169.mail.163.com/js3/read/readdata.jsp?sid=rDBzXXYYOQHlxRfQuHYYyKoyCwPuxgkt&mid=41:1tbiKR+i-kgYu+c39gAAsn&part=3][/img]
注:上面我举的政府的通知并不说明.Net事件的机制与它的机制一样,这里我只是为了理解,把他们相似点拿出来,做形象比较的,也是为从现象到本质的理解过程。

    

--------------------编程问答-------------------- 感谢分享,呵呵~ --------------------编程问答-------------------- 事件说明白了不就是实现回调吗。可能你本来触发的是一个系统的WM_PAINT 消息,但是返回来你调用的却是自己对WM_PAINT消息的重写。为什么可以这样那?说回来还不是函数指针帮你做的这件事情而已。那么这个概念映射到 C# 里面就是委托了(记得委托是个受托管的,是安全的类型)。 --------------------编程问答-------------------- 不错理解不聊而已
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,