设为首页 加入收藏

TOP

理解C#事件
2015-02-15 13:01:33 来源: 作者: 【 】 浏览:35
Tags:理解 事件

如果做过GUI程序开发,可能对上面的描述会比较熟悉。在GUI程序中,单击一个button会触发一个click事件,然后会执行一系列的操作,这一系列的操作就被存放在一个委托实例中。


接下来我们就看看事件。


回到前面文章中苹果和富士康的例子,苹果将iphone的组装、包装和运输的工作全部委托给了富士康。


根据上面的描述,我们修改了一下代码,在Apple这个类中加入一个订单属性,苹果只要接到新的订单,就发送一个通知给富士康,然后富士康就会执行一系列的操作了(组装、包装和运输)。


在主程序中,苹果将iphone的组装、包装和运输工作委托给了富士康,然后苹果每次收到订单,就会通过委托实例"VerdorToAssembleIphone"让富士康去执行一系列操作。


下面我们看下这个例子实现中的问题:


为了解决上面两个问题,出现了事件这个概念,我们要做的改变只是在声明委托实例的时候加上event关键字。


这时,上面两处有问题的代码就会在编译的时候报错了。 ? ?


上面的问题是解决了,但是event关键字作用是什么,事件跟委托有什么关系,"VerdorToAssembleIphone"怎么理解?


其实,下面这个语句还是比较难理解的,看到的第一反应就是,委托跟事件到底是什么关系,event关键字跟委托类型"AssembleIphoneHandler"是什么关系。


其实,事件可以理解成一个委托的属性,通过对委托实例的封装来对委托实例的访问进行一些限制。下面我们通过IL来查看一下这个个程序,得到下图。



下面我们就结合IL的查看结果来分析事件到底是什么。在开始之前,相信大家一定都熟悉属性(property)这个概念吧,那就让我们从熟悉的属性开始分析。


首先来看看我们熟悉的东西,"OrderNum"是我们定义的一个订单数量的属性(property),它有一组get/set方法。通过这个属性的get/set方法,我们可以访问"orderNum"字段(field)。



通过IL查看"OrderNum"这个属性,我们可以看到这个属性对应的get/set方法。


接下来再看"VerdorToAssembleIphone"事件,我们按照属性的方式去理解事件,从IL的截图中,可以看到事件中有一对addon/removeon方法来操作我们的委托实例(想想属性的get/set方法)。



同时,我们看到编译器给我们生成了一个private的field(如下),从这里我们可以看到事件"VerdorToAssembleIphone"本质上就是一个委托类型的变量。由于这个变量是private的,也就解释了为什么我们在定义事件的类外部不能直接访问这个变量。


根据上面的分析,我们可以看到,编译器帮我们进行了下面的代码转换。这样一来,就相当于通过event关键字对???托实例访问增加了一些限制。


原始的声明事件的C#代码:


编译器转换后的代码:


通过上面的分析,可以了解到事件封装了委托类型的实例,使得:


其实,上面的例子只是一个简单的演示。在很多情况下,事件使用过程中都会结合两个参数:事件源和事件参数。


所以,在事件编程中,可以参考下面一些规范:


通过本文介绍了事件的概念以及原理,解释了通过事件如何封装委托实例,并解决委托例子中遇到的两个问题。


同时了解了事件的使用:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇进一步理解C#委托 下一篇C#委托的基本概念

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: