1.delegate

MSDN:一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似。与 C 中的函数指针不同,委托是面向对象的、类型安全的和保险的。委托的类型由委托的名称定义

 
    class Program{const int num = 100;delegate bool delCompare(int a);static void Main(string[] args){delCompare hander = DelegateMethod;hander(1);}public static bool DelegateMethod(int a){return a > num;}}

用IL Disassemble查看

匿名委托:

匿名委托即使用了匿名方法的委托,IL层中的代码中会为匿名函数生一个静态的函数,本次的代码中的函数名是:CS$<>9__CachedAnonymousMethodDelegate1

    class Program{const int num = 100;delegate bool delCompare(int a);static void Main(string[] args){delCompare del = delegate(int a) { return a > num; };}}

用IL Disassemble查看

Lambda表达式

使用Lambda表达式与上一个Demo中使用匿名函数生成的IL代码是完全一样的

    class Program{const int num = 100;delegate bool delCompare(int a);static void Main(string[] args){delCompare del = a => a > num;}}

Func<T1..TResult>

使用Func<T1…TResult>中的Demo中,在IL层代中有所不同。代码中没有用到delegate,相当于在Main方法中直接调用了一个静态方法。理论上Func<T1…TResult>比delegate在时间和空间的效率都要高

    class Program{const int num = 100;//delegate bool delCompare(int a);static void Main(string[] args){Func<int, bool> del = a => a > num;}
  }

Expression(TDelegate)

表达式目录树以数据形式表示语言级别代码。数据存储在树形结构中。表达式目录树中的每个节点都表示一个表达式。以下Demo中IL层的代码中并未生成任何静态函数。

    class Program{const int num = 100;//delegate bool delCompare(int a);static void Main(string[] args){Expression<Func<int, bool>> exp = a => a > num; //生在表达式Func<int,bool> fun = exp.Compile(); //编辑表达式fun(1); //执行表达式}}

查看Main函数,在IL层代码中会对Expression动太编译生成实例!0,再通过Invoke(!0)调用方法

IL_0045: callvirt instance !0 class [System.Core]System.Linq.Expressions.Expression`1<class [mscorlib]System.Func`2<int32,bool>>::Compile()
IL_004a: stloc.1
IL_004b: ldloc.1
IL_004c: ldc.i4.1
IL_004d: callvirt instance !1 class [mscorlib]System.Func`2<int32,bool>::Invoke(!0)
IL_0052: pop
IL_0053: ret

总结:

匿名delegate和Lambda表达式本质是一样的,Func<T1..TResult>委托与delegate不同,它没有委托的异常调用等特性,在IL层生成的代码不同,执行方式不同。Expression(TDelegate)则是语言级别的,用于动太生成表达式,理论上Expression(TDelegate)效率最差。但在Linq表达式中必须用到

转载于:https://www.cnblogs.com/yexinw/archive/2012/08/08/2628655.html

delegate、Lambda表达式、Func委托和Expression(TDelegate)表达式目录树相关推荐

  1. 如何将自定义的 Delegate 转成 Func 委托?

    咨询区 AndreyAkinshin 场景是这样的,我自定义了一个 SomeDelegate 委托,然后将 Inc 方法灌入到其中,同时我也将 Inc 赋值给了 Func<int,int> ...

  2. 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

    一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...

  3. 匿名函数,Lambda表达式,委托

    C# 委托(Delegate) C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.委托( ...

  4. Expression 表达式目录树一

    这里有两段代码: 看一下 Where 的参数 Linq To object 的 where 方法需要的参数是 委托 Linq To Sql的 where 方法需要的参数  是被 Expression ...

  5. C#中的三种委托方式:Func委托,Action委托,Predicate委托

    C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...

  6. 表达式目录树(Expression)

    表达式目录树 什么是表达式目录树呢?用于表示Lambda表达式逻辑的一种数据结构,表达式树也可以称作表达式目录树,它 将代码表示成一个对象树,而不是可执行的代码.这个跟汇编原理一样,我们找到关键字,把 ...

  7. C# thread和delegate lambda函数结合的一段code

    以下是一段经典代码,可供以后参考并使用 首先是cs类: using System; using System.Collections.Generic; using System.Linq; using ...

  8. 通过创建动态类型 动态构建Expression Select表达式来控制Property可见性

    通过创建动态类型 动态构建Expression Select表达式来控制Property可见性 项目中经常遇到的一个场景,根据当前登录用户权限,仅返回权限内可见的内容.参考了很多开源框架,更多的是在V ...

  9. C# Expression表达式目录树

    Expression就是表达式目录树,是以树形数据结构表示代码,其中每一个节点都是一种表达式. 用lambda表达式来创建一个简单的Expression 使用lambda表达式,编译器在生成IL时会帮 ...

最新文章

  1. 基于Springboot实现作业管理系统
  2. Oracle ASM 翻译系列第十二弹:ASM Internal amdu - ASM Metadata Dump Utility
  3. C#中JSON和对象之间互相转换功能示例
  4. 4个数字,如何最快找到最小的2个数
  5. python unpack_python中struct.pack()函数和struct.unpack()函数
  6. centos7上使用chrony自动同步时间
  7. python做定时任务的方式及优缺点_使用Python做定时任务及时了解互联网动态
  8. L2-003. 月饼-PAT团体程序设计天梯赛GPLT
  9. 《精通软件性能测试与LoadRunner最佳实战》—第1章1.1节软件测试基础
  10. 用c语言计算星期,计算任何一天是星期几的C语言源代码.
  11. vs2015 编译时项目出现NuGet程序包还原失败,找不到xxx.xxx.xxx版本的程序包,怎么解决这个问题?
  12. html字体有哪些mac,Mac字体推荐
  13. 极通”由于找不到这台计算机安全许可证...i=258 R=2056“的 解决方法
  14. stagefright,OpenMax框架
  15. lag和lead 分析函数
  16. mac隐藏文件及查看隐藏文件
  17. 系统日志 html 模板,系统日志模板提取方法研究
  18. 微信小程序实现 短视频无限播放效果(类似快手小程序,抖音app的短视频滑动)
  19. 最小代价树(动态规划)
  20. JUC——JUC强大辅助类讲解

热门文章

  1. 2000及2005通用分页
  2. JS函数浅析之constructor、prototype属性
  3. 第21节 信息系统及其建设
  4. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】HAWQ数据仓库 使用之 gpfdist协议
  5. 爱奇艺称告别唯流量时代 正式关闭显示前台播放量
  6. Oracle 12C 新特性之级联truncate
  7. 存储过程系列之调试存储过程 SQL Server 2005
  8. pymongo TypeError
  9. Remove Duplicates from Sorted List
  10. ZOJ-2366 Weird Dissimilarity 动态规划+贪心