C#中的事件可以说是应用相当多的一种机制,这里从浅至深了解下C#中的事件机制:
PS:公司上网机上没有IDE工具,所以,有些代码只能是简单写一下,无法给出运行截图和完整测测试项目了;大家见谅!另,始终不习惯博客园的排版....
在VS的IDE中最简单的事件应用莫过于如下:
MessageBox.Show("Hello,这是事件回调结果!");
Hello,这是事件回调结果!
这是最简单的事件应用。接下来让我们看看用代码如何应用事件:
public Form1() { InitializeComponent(); button1.MouseHove+=new EventHandler(Button1_MouseHover) }
private void Button1_MouseHover(object sender,EventArgs e) { MessageBox.Show("喂,怎么还不点我?"); }
如何在自定义的类中定义事件呢?参看下面的代码:
class="code_img_closed" src="/Upload/Images/2014032417/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('9f8dc016-3a54-4f8a-856a-53fcddc6b8d7',event)" src="/Upload/Images/2014032417/2B1B950FA3DF188F.gif" alt="" />public class UserEventClass { public void TriggerEvent() { } protected virtual void OnEventTrigger() { var handler= EventTriggered; if(handler!=null) { handler(this,new EventArgs()); } } public event EventHandler EventTriggered; }View Code
PS:上面的代码效果是什么呢?调用UserEventClass 实例的TriggerEvent方法即会触发该实例的EventTriggered事件。至于为什么使用OnEventTrigger来最终完成事件的触发,会在下面做出解释。
然后就可以象使用控件中的事件一样来使用我们自定义的事件了。
当然,更复杂的自定义事件方式可以在博客园找到很多资料,基本上都大同小异,例如:
C#事件(event)解析-徐洪军
C#事件-张雪飞
在上面的文章2中有讲解如何安全引发事件,这就是上面自定义事件代码中使用OnEventTrigger来最终完成事件的触发的原因。同时,OnEventTrigger被标为protected virtual,这样在UserEventClass的子类中,可以重写OnEventTrigger方法来进行需要的修改。
所有的教材里面都会先讲解C#委托,然后才会讲解C#事件,因为事件本质上仍然是由委托完成的,其神奇的表现仅仅是微软工程师们给我们的语法糖(PS:可能有点偏激)。委托与事件之间的关联可以参看下面的文章:
C# 中的委托和事件-张子阳
C#中的委托和事件(续) -张子阳
这里面要深究的其实应该是多播委托的委托链调用机制,拿出我们的反编译神器Reflecter,看看Combine里面有什么?
上面粗略描述了事件的使用,自定义及其深入机制,下面说说使用事件时需要注意的几个问题: