lambda表达式-编译测试

简介:
+关注继续查看

我不会IL,也不想学IL,所以为了测试Lambda表达式编译的原理,只能使用调试进行试验来认识:

第一种情况,当Lambda表达式没有用到函数外的变量时:

class MyClass2
{
    public Action TestLambda()
    {
        Action action = () =>
        {
            Console.WriteLine(DateTime.Now);
        };
        return action;
    }
    public static void Test()
    {
        MyClass2 c2 = new MyClass2();
        var action = c2.TestLambda();
        var action2 = c2.TestLambda();

        Console.WriteLine(action.Method.DeclaringType.FullName);//"ConsoleApp.Program+MyClass2"
        Console.WriteLine(action.Method.IsStatic);//"true"
        Console.WriteLine(action.Target);//"" null
        Console.WriteLine(action == action2);//true
    }
}

这种情况下,action被编译成了MyClass2的静态方法

 

第二种情况,当Lambda表达式使用到函数外的变量时:

class MyClass
{
    public Action TestLambda()
    {
        int i = 1;
        int j = 5;
        Action action = () =>
        {
            Console.WriteLine(i);
            Console.WriteLine(j);
        };
        i++;
        return action;
    }
    public static void Test()
    {
        MyClass c = new MyClass();
        var action = c.TestLambda();
        var action2 = c.TestLambda();
        action();//2
        Console.WriteLine(action.Target.GetType().FullName);//"ConsoleApp.Program+MyClass+<>c__DisplayClass6"
        Console.WriteLine(action.Method.DeclaringType.FullName);//"ConsoleApp.Program+MyClass+<>c__DisplayClass6"
        Console.WriteLine(action == action2);//false
        Console.WriteLine(action.Target == action2.Target);//false
    }
}

调试发现action.Target如下:

image

也就是说这时候,这个lambda编译成了一个私有类的实例方法,而且数据就是外部被使用的变量

另外,每次调用TestLambda获取到的action.Target都是一个新的对象


本文转自BloodyAngel博客园博客,原文链接:http://www.cnblogs.com/zgynhqf/archive/2009/12/25/1632086.html,如需转载请自行联系原作者

相关文章
|
26天前
|
Ubuntu 编译器 网络安全
RK3568开发笔记(七):在宿主机ubuntu上搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试
在之前的博文中已经搭建好了一个比较完善的ubuntu宿主机,都很完善了但是发现没有Qt交叉编译开发环境,所以还需要搭建一套Qt交叉编译开发环境。
|
4月前
|
IDE 编译器 开发工具
统信UOS系统开发笔记(四):从Qt源码编译安装之编译安装QtCreator4.11.2,并配置编译测试Demo
上一篇已经从Qt源码编译了Qt,那么Qt开发的IDE为QtCreator,本篇从源码编译安装QtCreator,并配置好构建套件,运行Demo并测试。
|
5月前
|
Ubuntu 编译器 Linux
Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
前面学习了驱动的基础框架,上一篇编译了gcc7.3.0,那么为了方便很好的熟悉流程,本篇,将使用ubuntu18.04,直接编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试。
|
6月前
|
关系型数据库 MySQL 数据库连接
Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库测试
mysql驱动版本msvc2015x32版本调好, mysql的mingw32版本的驱动上一个版本编译并测试好,有些三方库最低支持vs2017,所以只能使用msvc2017x64,基于Qt5.9.3,于是本篇编译mysql驱动的msvc2017x64版本,满足当前的特定需求,这次过程有点费劲,可能是Qt的版本低于Qt5.12,继续无保留分享出来。   本篇主要描述Qt5.9.3 msvc2017x64 + mysql8.0.16的驱动编译过程。
|
7月前
|
关系型数据库 MySQL 数据库
Qt+MySql开发笔记:Qt5.9.3的mingw32版本编译MySql8版本驱动并Demo连接数据库测试
之前特定的mysql版本msvc版本已经调通了,但是为了更好的跨平台,所以选择用mingw32版本,于是需要编译mysql驱动的mingw32版本的驱动库,以便提供给qt连接mysql使用。
Qt+MySql开发笔记:Qt5.9.3的mingw32版本编译MySql8版本驱动并Demo连接数据库测试
|
9月前
|
Linux
使用tcping测试服务器端口是否可访问,及LINUX上的编译与使用
使用tcping测试服务器端口是否可访问,及LINUX上的编译与使用
108 0
|
SQL NoSQL 关系型数据库
聊聊ClickHouse的开发、编译和测试
聊聊ClickHouse的开发、编译和测试
298 0
|
IDE 编译器 开发工具
麒麟系统开发笔记(四):从Qt源码编译安装之编译安装QtCreator4.8.1,并配置编译测试Demo
麒麟系统开发笔记(四):从Qt源码编译安装之编译安装QtCreator4.8.1,并配置编译测试Demo
麒麟系统开发笔记(四):从Qt源码编译安装之编译安装QtCreator4.8.1,并配置编译测试Demo
saba开发笔记(一):saba介绍、编译使用以及测试
saba开发笔记(一):saba介绍、编译使用以及测试
saba开发笔记(一):saba介绍、编译使用以及测试
|
Ubuntu Linux
Linux驱动开发: Ubuntu(PC机)系统上编译驱动并加载测试
Linux驱动开发: Ubuntu(PC机)系统上编译驱动并加载测试
418 0
相关产品
云迁移中心
推荐文章
更多