开发者社区> 文艺小青年> 正文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
18342 0
深入探讨 Lambda 表达式(下)
说明: > 由于 Lambda 表达式涉及的周边知识点实在太多,因此拆分为上、下两篇文章讲解。 > > 本篇为下篇,上篇请点击:[深入探讨 Lambda 表达式(上)](https://www.atatech.org/articles/159525) 目录介绍: ![1.png](https://ata2-img.cn-hangzhou.oss-pub.aliyun-inc.co
637 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
23611 0
Spark中Lambda表达式的变量作用域
通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test;   public class T1 {     public static void main(String[] args) {         repeatMessage(...
817 0
Python学习笔记:lambda表达式与函数式编程
1,lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。lambda是一个表达式而不是一个语句。它能够出现在Python语法不允许def出现的地方。作为表达式,lambda返回一个值(即一个新的函数)。
1328 0
函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数
函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数.md 之剑 2016.5.2 11:19:09 什么是lambda表达式 例子 For example, in Lisp the 'square' function can b...
1086 0
3576
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载