一、我们先看下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. 用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 Jinja 中常用的过滤器 default float int len ...

  2. 'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。

    解决方法: 本方法适用于已经成功安装python并配置了环境变量. 1.到官网下载pip.py文件 https://pypi.python.org/pypi/pip#downloads 点击下载,解压 ...

  3. Redis源码编译安装

    介绍 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵 ...

  4. springboot核心原理

    1.基于你对springboot的理解描述一下什么是springboot 它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用, 内置tomcat,无需打包部署,直接运行. 2. ...

  5. SpringMVC入门及拦截器

    SSM最后一个框架springmvc,其实上手特别简单.但是我昨天看一个深入源码的视频,差点GG.其实以前学过很多东西,都忘了,不敢说学会,现在有了本书,看过一遍之后.多多少少记住一些,权当我会用了, ...

  6. spark复习总结01

    1.MapReduce和spark的对比 MapReduce Spark 数据存储结构:磁盘hdfs文件系统的split 使用内存构建弹性分布式数据集RDD,对数据进行运算和cache 编程范式:Ma ...

  7. [轉]sendpage漏洞分析 CVE-2009-2692

    之前看了<新爆内核高危漏洞sock_sendpage的利用分析的讨论 >这篇帖子,在九贱兄和诸位CUer的指引下,大致弄清了整个漏洞的始末.现与大家分享(引用自我的空间 ).有什么不足之处 ...

  8. Html5介绍及新增标签

    什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍 ...

  9. Oracle 五笔码函数

    五笔码 select comm.fun_spellcode_wb('数据库') from dual 结果:ORY 函数 CREATE OR REPLACE FUNCTION COMM.FUN_SPEL ...

  10. poj 2752 kmp的next数组

    题目大意: 求一个字符串中某一个既是前缀又是后缀的前缀的结尾下标: 基本思路: 从_next[len]开始找_next[_next[len]],再找_next[_next[_next[len]]],一 ...