您的位置:首页 > 编程语言 > C#

(每日心得)关于C#中委托和事件的一些认识(三)

2013-09-29 12:08 483 查看
[b]在了解委托与事件前,我们先看一段代码:[/b]





在这段代码中我在factory类中创建了一个public 类型的委托,然后利用委托生成了一个event类型的事件。接着在主函数中就可以利用事件,使用类似于委托实例的方法向事件加入方法。那么委托和事件究竟有什么关系呢?

在讨论委托和事件的关系时,我们现在反编译器中查看一下编译器帮我们生成的代码,如下所示:



我们可以很清晰的看到在VS2012中所写的代码,编译器做了处理,其中最重要的是对委托的处理,我们可以清晰的看到编译器相较于我所写的多了

语句,相较于

我想大家更熟悉前者。前者正是我们所熟悉的委托的实例化语句。


在这个factory类中我们首先声明了一个委托类型,当然这个委托要声明为public ,因为delegate本身会被编译器扩展为类,如果把一个类声明为private类型,那么该delegate只是可以在他所属类型中被访问。所以如果实例了一个public类型的实例,显然是要在外界也去访问该delegate类型的实例,但是这个委托的声明类型要求改委托只是可以在包含他的代码块中被访问。这样实例化对象(也就是delegate的对象)的作用域要大于其声明类型,这显然是不合适的。并且我们声明delegate本身也就是为了在外界访问他。

如果我们现在去掉event语句而仅仅是使用delegate类型的实例。那么代码如下



这样在不改变其他代码的前提下,程序一样能够正常运行。相较于注释部分,新的代码只是少了event关键字,但是二者却有着等同的效果。如果拿类中的字段与属性相类比,其实我们发现二者具有相同的效果。而且编译器也的确会这样做,下述是编译器为事件以及为属性所生成的代码结构:

事件:



属性:



由上述代码我们就可以清楚地看到编译器对事件和属性进行了相似的操作。从这一点上我们也可以看到在C#中代码并不是看起来差别那么大,他们都是有规律可循,如果了解了内部细节将有利于我们使用C#更好的编写程序。

以上就是我对C#委托事件的认识,希望大家有什么不同意见能够和我联系,这样有助于我们大家共同进步,当然对小弟我有非常大的好处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: