一、我们先看下C#代码下Lamdba表达式的写法

  // <summary>
/// 写入日志委托
/// </summary>
/// <param name="message">消息</param>
delegate void WriteLog(string message);
class Program
{
static void Main(string[] args)
{
{
WriteLog method = (message) => { Console.WriteLine(message); };
method.Invoke("写入日志测试1");
}
{
WriteLog method = (message) => { Console.WriteLine(message); };
method.Invoke("写入日志测试2");
}
Console.ReadKey();
}
}

  

二、再通过反编译工具查看

internal class Program
{
[CompilerGenerated]
[Serializable]
private sealed class <>c
{
public static readonly Program.<>c <>9 = new Program.<>c(); public static WriteLog <>9__0_0; public static WriteLog <>9__0_1; internal void <Main>b__0_0(string message)
{
Console.WriteLine(message);
} internal void <Main>b__0_1(string message)
{
Console.WriteLine(message);
}
} private static void Main(string[] args)
{
WriteLog arg_21_0;
if ((arg_21_0 = Program.<>c.<>9__0_0) == null)
{
arg_21_0 = (Program.<>c.<>9__0_0 = new WriteLog(Program.<>c.<>9.<Main>b__0_0));
}
WriteLog writeLog = arg_21_0;
writeLog("写入日志测试1");
WriteLog arg_4F_0;
if ((arg_4F_0 = Program.<>c.<>9__0_1) == null)
{
arg_4F_0 = (Program.<>c.<>9__0_1 = new WriteLog(Program.<>c.<>9.<Main>b__0_1));
}
WriteLog writeLog2 = arg_4F_0;
writeLog2("写入日志测试2");
Console.ReadKey();
}
}

三、下面我们来看一组对比图,就非常容易的看出来了

由此我们得出的结论:编译器将lambda表达式生成一个类种类,每个lamdda也会生成一个独立的方法,然后绑定到委托的实例,所谓的lamdba表达式其实只是一个“语法糖”。

Lambda表达式底层分析的更多相关文章

  1. lambda表达式底层处理机制

    为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢? 在没有深入分析前,让我们先 ...

  2. java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现

    问题解决思路:查看编译生成的字节码文件 目录 测试匿名内部类的实现 小结 测试lambda表达式 小结 测试方法引用 小结 三种实现方式的总结 对于lambda表达式,为什么java8要这样做? 理论 ...

  3. Java Lambda 表达式源码分析

    基本概念 Lambda 表达式 函数式接口 方法引用 深入实现原理 字节码 为什么不使用匿名内部类? invokedynamic 总结 参考链接 GitHub 项目 Lambda 表达式是什么?JVM ...

  4. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  5. [Java 8] (9) Lambda表达式对递归的优化(下) - 使用备忘录模式(Memoization Pattern) .

    使用备忘录模式(Memoization Pattern)提高性能 这个模式说白了,就是将需要进行大量计算的结果缓存起来,然后在下次需要的时候直接取得就好了.因此,底层只需要使用一个Map就够了. 但是 ...

  6. Java基础(十二)lambda表达式

    1.引入lambda表达式的重要性 lambda表达式是一个可传递的代码块,可以在以后执行一次或多次. 在前面的回调部分,有一个例子是,ActionListener类实现了TimePrinter接口并 ...

  7. C++—lambda表达式+优先队列 prority_queue+关键字decltype

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入:[  1->4->5,  1->3->4,  2->6]输出: 1->1-&g ...

  8. 5万字长文:Stream和Lambda表达式最佳实践-附PDF下载

    目录 1. Streams简介 1.1 创建Stream 1.2 Streams多线程 1.3 Stream的基本操作 Matching Filtering Mapping FlatMap Reduc ...

  9. Lambda表达式运行原理

    目录 一.创建测试样例 二.利用Java命令编译分析 三.文末 JDK8引入了Lambda表达式以后,对我们写代码提供了很大的便利,那么Lambda表达式是如何运用简单表示来达到运行效果的呢?今天,我 ...

随机推荐

  1. JavaFX教程

    JavaFX是Java的下一代图形用户界面工具包.JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序. JavaFX允许开发人员快速构建丰富的跨平台应用程序.JavaFX通 ...

  2. linux下文件编码格式转换方法(gb18030/utf-8)

    文章转载自:http://www.firekyrin.com/archives/249.html linux下文件编码格式转换方法(gb18030/utf-8) 在Linux做开发或者系统管理遇到乱 ...

  3. jQuery内容过滤选择器再探究(原创)

    内容过滤选择器不算复杂,但还是有需要注意的地方

  4. DB2连接

    ibm_db.connect 创建非持久连接. ibm_db.pconnect 创建持久连接. 在最初的Python脚本请求之后,持久的连接保持打开状态,这允许后续的Python请求重新使用连接. 后 ...

  5. ssh文件 ip锁定

    vi ~/.ssh/config Host web*hostname 115.29.242.1**user lian Host **hostname 192.168.1.**user dface

  6. 在egg中配置 sequelize

    如何在eggjs中引入 sequlize 安装 第一步,在项目中安装 egg-sequelize插件和mysql插件 npm install --save egg-sequelize mysql2 第 ...

  7. css3 新特性(动画)

    1. 制作动画 先定义动画,再使用(调用)动画 使用 keyframes(关键帧)定义动画(类似定义类选择器) @keyframes 动画名称{ 0%{ width:100px; } 100%{ wi ...

  8. 解决.Net MVC 中出现 非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复: required 的bug

    最近在开动科技创新作品的开发,出现了一个让人很烦恼的错误,每次从浏览页跳转到编辑页时就会出现一下错误 非介入式客户端验证规则中的验证类型名称必须唯一.下列验证类型出现重复: required 上一下出 ...

  9. 2018-8-10-win10-UWP-ListView-

    title author date CreateTime categories win10 UWP ListView lindexi 2018-08-10 19:16:53 +0800 2018-2- ...

  10. .babelrc配置例子

    { "presets":[ ["es2015",{"modlues":false}], "react", ], &quo ...