委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
在讲委托,事件之前,我想问大家一个非常简单的问题,也许在我们日常的编程中基本上每天都会遇到,但是却往往不去了解的地方,请以下代码:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnSearch_Click(object sender, ImageClickEventArgs e)
{
}
protected void grdBill_RowDataBound(object sender, GridViewRowEventArgs e)
{
}
protected void grdBill_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
}
看完之后大家是不是很熟悉,是不是我们每天都遇到过的,但是大家有没有想过所有方法中的两个参数(sender,e),到底是什么意思,有的人可能会说,这些
都是VS编译环境自动生成的,搞的这么清楚干什么,能用就行了呗,不就是个窗体加载事件、点击按钮事件嘛,第二种人可能马上会去百度,谷歌一下
会马上得出查询结果
第一個,sender,也就是引起事件的那個對象
第二個,e,包含了事件的信息
哦!第一个表示事件的对象,第二个表示事件的信息,貌似好像云里雾里的,接着查:
摘自网络的师生的一段对话:
大李推了推眼镜,反问我道:“你应该对Windows编程中的事件驱动程序设计很熟悉吧?”
“是呀!”看来反问是大李授课的开篇词了,但我也只好先往他的圈套里跳,“事件驱动就是说应用程序的执行流程是由外界发生的事件所确定的。也就是接受到任务才工作的模式。事件就是一个信号,它告知应用程序有重要情况要发生。实际上的执行情况是,各个应用程序把负责不同工作的对象在其运行期间送入Windows操作系统,让这些对象等待Windows产生的事件,然后加以处理。”
“VB程序员一般也只需要象你这样理解就行了。”大李的话真让我触动,“应该说是Windows先产生消息,应用程序中的窗口程序window procedure能接收来自windows的消息,并将其转化为事件,这个我们以后再说。现在来看看事件驱动程序的组成,主要是有事件、对象和事件处理程序三个要素。对象就是完成任务的主体,比如你说的Button1;事件么,就是对象要执行的任务,比如单击,就是click事件;那么事件处理程序就是Button1_Click这段程序了。”
“这个我知道呀!我只是想问一下Sender……”我疑惑地回应道。
大李哥摇摇手,打断了我的话。“如果你真正清楚事件驱动的话,就明白了。你看一下,Sender是什么类型的变量?”
“object呀!”我无奈地问道着,“但是,……”我隐约感觉到了什么。
大李微笑着说,“sender as object,就一语道破它的来源与用途。object是支持 .NET 框架类层次结构中的所有类,并为派生类提供低级别服务。这是 .NET 框架中所有类的最终超类;它是类型层次结构的根。一般来说,sender在形参中表示引发事件的源头,就是我刚才所说的三要素中的‘对象’。如果在控件引发的事件中写代码的话,一般都不需要再重新指派,因为它已经默认为是该控件了。当自己写代码来调用某事件程序时,就要注明sender是何物了。”
“也就是说,sender是提供给在事件处理程序代码内部或外部进行调用的吗?”我仍有点不明白。
“可以这样说,你难道看不出VB.NET提供给我们的是更全面、更直接的控制吗?再说e,表示的是事件数据,就是一个事件激发所需要的状态信息。在事件引发时不向事件处理程序传递状态信息的事件会将e设为Eventargs。如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。比如Mousedown事件,系统需要判断mouse的位置、判断是左中右哪个键点击了、判断点击了几下等等,因此该e就必需是System.Windows.Forms.MouseEventArgs类的实例。”
看完这段对话后,大家可能对什么是Sender和e,有了初步的了解,但是让你应用,或者更深层次的举一反三,我想很多人只能呆坐了。
以上只是我引出委托、事件的序言而已,委托与事件的使用广泛,是毋庸置疑的,但是在我们日常编程中,怎么去应用来更好的使用C#给我们这样利器,我会在下一讲使用大白话的方式、从潜入深的讲解。
首页推荐不能放,我就放这里好了
============ 欢迎各位老板打赏~ ===========
与本文相关的文章
- · 深入浅出C#委托与事件系列(八)
- · 深入浅出C#委托与事件系列(七)
- · 深入浅出C#委托与事件系列(六)
- · 深入浅出C#委托与事件系列(五)
- · 深入浅出C#委托与事件系列(四)
- · 深入浅出C#委托与事件系列(三)
- · 深入浅出C#委托与事件系列(二)
- · The instance of entity type ‘Customer’ cannot be tracked because another instance with the same key value for {‘Id’} is already being tracked.
- · .NET8实时更新nginx ip地址归属地
- · 解决.NET Blazor子组件不刷新问题
- · .NET8如何在普通类库中引用 Microsoft.AspNetCore
- · .NET8 Mysql SSL error