通过IL分析C#中的委托事件FuncActionPredicate之间的区别与联系

Posted 衣舞晨风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过IL分析C#中的委托事件FuncActionPredicate之间的区别与联系相关的知识,希望对你有一定的参考价值。

一直以来都是对于事件与委托比较混淆,而且不太会用。找了个时间,总结了一下,感觉清晰了很多。

先说一下个人理解的结论吧:

      delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。

     delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在delegate声明变量的基础上包装而成的,类似于变量与属性的关系(在IL代码中可以看到每一个delegate声明的事件都对应是私有的delegate声明的变量),提升了安全性。

      Action 与Func:这两个其实说白了就是系统定义好的Delegate,他有很多重载的方法,便于各种应用情况下的调用。他在系统的System命名空间下,因此全局可见。

首先了解一下, ILDasm中图标含义:  

   

该图来自:http://www.cnblogs.com/zery/p/3366175.html

委托创建步骤:

1、用delegate关键字创建一个委托,包括声明返回值和参数类型
2、使用的地方接收这个委托
3、创建这个委托的实例并指定一个返回值和参数类型匹配的方法传递过去


一、事件与委托


新建一个事件委托测试项目:EventDelegateTest

具体代码如下:

<span style="font-size:14px;"><span style="font-size:14px;">namespace EventDelegateTest
{
    public class TestClass
    {
        public delegate int delegateAction();
        public event delegateAction OnActionEvent;
        public delegateAction daNew;
    }
}</span></span>
编译代码后,使用 Visual Studio 2010自带的ILDASM.EXE:


打开该dll,可以看到如下信息:


从上图可以看出如下几点信息:

以上是关于通过IL分析C#中的委托事件FuncActionPredicate之间的区别与联系的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的委托和事件

C#中的委托(转)

C# 中的委托和事件

C#综合揭秘——深入分析委托与事件

C#深入分析委托与事件

c#委托