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

C#中事件的作用?跟函数有什么区别

今天看了下c#的事件,书上讲的有点含糊。
不太清楚事件在哪些地方能起作用,既然事件是某种到达后引发的,那为什么不调用函数呢?

所以有此问:C#中事件的作用?跟函数有什么区别?

望各位前辈赐教

--------------------编程问答-------------------- C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子:

public delegate void MyEventHandler(object sender, MyEventArgs e);
--------------------编程问答-------------------- 事件可以当作是一个指向方法的指针,在C#很多地方都会使用到(当然,如果你不是处于初学阶段),特别是在分布式管理,或者控件组件什么的。事件用得特别多。
http://download.csdn.net/user/jhkemail
上面这个链接里有一个使用事件实现的控件,是一个功能还不错的DataGridView有源码可供参考。 --------------------编程问答-------------------- 事件和函数的另一个区别是:他们的参数不同,事件有1〉object sender 是传送引发事件对象的本身的引用,
2〉System.EventArgs e 是传送事件引发时传送相关信息。
事件能被消息触发,函数能被别的函数或事件调用。 --------------------编程问答-------------------- LZ所理解的事件其实还是停留在 public void on_Xxxx(Object sender, EventArgs e){} 函数上面, 其实 on_Xxxx() 也是一个函数, 而且跟普通的函数没什么两样, 关键在于 on_Xxxx绑定在某个委托上,并在程序的某个地方调用了该委托(即事件触发的地方),LZ之所以有这样的疑问,是因为对C#里面的委托还有理解,这个对你或许会有帮助
http://www.cnblogs.com/yyw84/archive/2006/12/27/604544.html --------------------编程问答-------------------- 很是不太理解事件,除了图形界面的按钮之类的内置事件外,自定义事件似乎没什么用啊,反而更麻烦,写了一大堆的代码又是事件发送器事件接收器的,为什么不直接到掉用处理方法吗?有脱裤子放弃之嫌啊,请高人赐教 --------------------编程问答-------------------- 事件就是绑定的函数! --------------------编程问答-------------------- 举个例子吧:
比如你有一个类A
你在类B中实例化A

而如果A中有一个变量a的值(随时可能变化),B对象想实时获取a值。
这种情况,就需要用到事件了,因为你的B对象按普通调用方法的方式来读取a变量值,就达不到实时的效果,
通过实例化事件时,A类中的a有了变化,就会向B类自动传递 --------------------编程问答--------------------  因为 事件的接受者 不知道具体的 发送对象

也就是发布-订阅的 模式

所以可以使用委托 
object sender 就是发送消息者
委派一个类比如EventArgs 去传提一些信息
--------------------编程问答-------------------- 跟我一样,我也是个初学者,半知不解的, --------------------编程问答-------------------- 事件就是委托,委托可以将方法作为另一个方法的参数传递,委托指向关联方法的引用地址。
事件:类或结构状态发生改变时,发出的消息通知。
--------------------编程问答-------------------- 当你点击一个确定按钮时,这里就产生了一个点击事件,但是点击事件要做什么事还不知道,这就需要写个函数,让点击事件去调用它——这是最简单的关联。 --------------------编程问答--------------------
引用楼主 wangqiaosm 的回复:
今天看了下c#的事件,书上讲的有点含糊。
不太清楚事件在哪些地方能起作用,既然事件是某种到达后引发的,那为什么不调用函数呢?

所以有此问:C#中事件的作用?跟函数有什么区别?

望各位前辈赐教


掉用谁?

事件声明在抛出事件的对象内部,它是通知任何关心(监听)自己这个事件的客户程序。如果你说“调用函数”,那么你想说事件调用谁呢?

实际上,《设计模式》的作者不懂事件(尽管事件早已经在那本书写出之前许多年流行语微软的vb等许多开发工具中了),于是在设计模式中有超过十几种模式都用楼主这种蹩脚的思路去设计出复杂的一堆东西,从大半本《设计模式》到后来无数本书都在用各种比喻来解释这个机制。而事件仅用一个简单的“一句话”就干净利落地实现了“服务有事需要反向调用客户”的依赖倒置机制。 --------------------编程问答-------------------- 让我们看1楼的代码,每一个这种delegate声明都声明了一个class,尽管它的语法看起来跟普通的class不太一样,但是这里就是声明了一个叫做MyEventHandler的类,只不过其实例化方法有两个参数而已。不要把这个误以为是函数,更不要以为是指针。它是复杂的class!

正因为此,接下来实际使用时就需要声明其实例:

public MyEventHandler abc;

或者

public event MyEventHandler abc; --------------------编程问答-------------------- Windows 的工作方式:窗口、事件和消息

全面地讨论 Windows 的内部工作机制将需要整整一本书的容量。没有必要深入了解所有的技术细节。Windows 的工作机制,简单地说就是三个关键的概念:窗口、事件和消息。

Microsoft Windows 操作系统通过给每一个窗口指定一个唯一的标识号(窗口句柄或 hWnd)来管理所有的窗口。操作系统连续地监视每一个窗口的活动或事件的信号。事件可以通过诸如单击鼠标或按下按键的操作而产生,也可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。

每发生一次事件,将引发一条消息发送至操作系统。操作系统处理该消息并广播给其它窗口。然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如,当窗口解除了其它窗口的覆盖时,重显自身窗口)。

在事件驱动的应用程序中,代码不是按照预定的路径执行-而是在响应不同的事件时执行不同的代码片段。事件可以由用户操作触发、也可以由来自操作系统或其它应用程序的消息触发、甚至由应用程序本身的消息触发。这些事件的顺序决定了代码执行的顺序,因此应用程序每次运行时所经过的代码的路径都是不同的。

因为事件的顺序是无法预测的,所以在代码中必须对执行时的“各种状态”作一定的假设。当作出某些假设时(例如,假设在运行来处理某一输入字段的过程之前,该输入字段必须包含确定的值),应该组织好应用程序的结构,以确保该假设始终有效(例如,在输入字段中有值之前禁止使用启动该处理过程的命令按钮)。

在执行中代码也可以触发事件。例如,在程序中改变文本框中的文本将引发文本框的 Change 事件。如果 Change 事件中包含有代码,则将导致该代码的执行。如果原来假设该事件仅能由用户的交互操作所触发,则可能会产生意料之外的结果。正因为这一原因,所以在设计应用程序时理解事件驱动模型并牢记在心是非常重要的。

事件驱动应用程序的工作方式


事件是窗体或控件识别的动作。在响应事件时,事件驱动应用程序执行 Basic 代码。Visual Basic 的每一个窗体和控件都有一个预定义的事件集。如果其中有一个事件发生,而且,在关联的事件过程中存在代码,则 Visual Basic 调用该代码。

尽管 Visual Basic 中的对象自动识别预定义的事件集,但要判定它们是否响应具体事件以及如何响应具体事件则是编程的责任了。代码部分(即事件过程)与每个事件对应。 想让控件响应事件时,就把代码写入这个事件的事件过程之中。

对象所识别的事件类型多种多样,但多数类型为大多数控件所共有。例如,大多数对象都能识别 click 事件—如果单击窗体,则执行窗体的单击事件过程中的代码;如果单击命令按钮,则执行命令按钮的 click 事件过程中的代码。每个情况中的实际代码几乎完全不一样。

这里是事件驱动应用程序中的典型事件序列: 

启动应用程序,装载和显示窗体。


窗体(或窗体上的控件)接收事件。事件可由用户引发(例如键盘操作),可由系统引发(例如定时器事件),也可由代码间接引发(例如,当代码装载窗体时的 Load 事件)。


如果在相应的事件过程中存在代码,就执行代码。


应用程序等待下一次事件。 
注意 许多事件伴随其它事件发生。例如,在 DblClick 事件发生时,MouseDown、MouseUp 和 Click 事件也会发生。 
--------------------编程问答-------------------- 事件就是绑定函数!和事件对应的是事件处理函数,这个函数,你什么时候执行它呢?当和它对应的这个事件被触发后就执行这个函数,例如你点击一个“确定”按钮时,这里就触发了一个点击事件,然后就执行和这个事件绑定的事件处理函数,例如  private void btnOK_Click(object sender, EventArgs e)
        {......}

这个要结合Winform来理解就很好理解。 --------------------编程问答-------------------- 事件(委托)是接口, 是函数(方法)级別的接口.

对比: 真正的接口(Interface)是类级别的接口. --------------------编程问答-------------------- 事件就是委托?搞笑了,12L的兄弟已经说的很清楚了,委托是一种表面简单,内里复杂的类,而事件可以单纯的看做一个种方法,事件和方法(.net已经不兴说函数了)的关系就好比宾馆的房间和你家一样,宾馆的房间你永远不可能会知道下一个住进来的人是谁,而你家的房间很明显就是你家人在住的。事件也是,他负责侦听一类消息,而这类消息你很可能不知道调用来自哪里,但是自定义的方法则很明确,我想没有人会自定义一堆的方法而不去主动调用的吧。委托就好像宾馆的前台,当有客人来订房的时候,她会告诉客人,您应该去哪个房间。 --------------------编程问答-------------------- 事件归根到底还是函数调用,不管你说上天去,还是说下海去 --------------------编程问答--------------------
引用 17 楼 sosoyiyi 的回复:
事件就是委托?搞笑了,12L的兄弟已经说的很清楚了,委托是一种表面简单,内里复杂的类,而事件可以单纯的看做一个种方法,事件和方法(.net已经不兴说函数了)的关系就好比宾馆的房间和你家一样,宾馆的房间你永远不可能会知道下一个住进来的人是谁,而你家的房间很明显就是你家人在住的。事件也是,他负责侦听一类消息,而这类消息你很可能不知道调用来自哪里,但是自定义的方法则很明确,我想没有人会自定义一堆的方法而?-

这样说来挺形象的
谢谢 --------------------编程问答-------------------- 简言之:事件也是某种类的实例对象。

事件处理程序就是特殊的方法。 --------------------编程问答-------------------- lz实际上说的很明白,他就是调用。

关键的问题在于,两点
1.调用谁,已什么样的规定来调用
2.类编写者是否事先就知道去用哪个对象的哪个方法?

lz问题在于“已知”,如果上面2条都已知,ok,那么lz就可以说,我可以不用委托和事件,我想调谁就调谁

问题是如果上面2条是“未知”,那么lz如何处理。我们说既然未知,那么类编写者就要自己规定好规则(委托申明),处理调用(调用外部函数),规定好外部使用方式(申明事件)

ps:说句与帖子无关的话题。个人比较同意sp1234的看法,对于GoF那些设计模式来说,他们是早期的经典,用的是早期的方法,事易时移-目前来说很多东西已经不太合用了(比如工厂类,大多数泛型情况下,工厂类的作用已经不那么明显了。),当然我也不否认GOF的经典性,他们处理事务的策略还是很高明的,值得学习和借鉴。(只是看着很多人把GOF,MVC,分层,当数学公式去研究,觉着太别扭了!处理策略才是他们的核心,要得意而忘形才对) --------------------编程问答-------------------- 事件是通过委托实现的 --------------------编程问答-------------------- 这坟挖的。。。。 --------------------编程问答-------------------- 我也是初学者,对于事件很难理解透彻!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,