当前位置: 首页 > news >正文

使用Reflector查看闭包

第一种:
.Net 3.5 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 闭包
{
    class Program
    {
        static void Main(string[] args)
        {         
            List<Action> arr = new List<Action>();
            for (int i = 0; i < 3; i++)
            {
                arr.Add(()=>{Console.WriteLine(i);});
            }

            foreach (var item in arr)
            {
                item();//输出3,3,3
            }
        }
    }
}

转换为.Net1.0的代码:
[CompilerGenerated]
private sealed class <>c__DisplayClass2
{
    // Fields
    public int i;

    // Methods
    public void <Main>b__0()
    {
        Console.WriteLine(this.i);
    }
}

 
private static void Main(string[] args)
{
    List<Action> arr = new List<Action>();
    Action CS$<>9__CachedAnonymousMethodDelegate1 = null;
    <>c__DisplayClass2 CS$<>8__locals3 = new <>c__DisplayClass2();
    CS$<>8__locals3.i = 0;
    while (CS$<>8__locals3.i < 3)
    {
        if (CS$<>9__CachedAnonymousMethodDelegate1 == null)//在这里只实例化一个对象
        {
            CS$<>9__CachedAnonymousMethodDelegate1 = new Action(CS$<>8__locals3.<Main>b__0);
        }
        arr.Add(CS$<>9__CachedAnonymousMethodDelegate1);
        CS$<>8__locals3.i++;
    }
    foreach (Action item in arr)
    {
        item();
    }
}

第二种:
.Net 3.5 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 闭包
{
    class Program
    {
        static void Main(string[] args)
        {         
            List<Action> arr = new List<Action>();
            for (int i = 0; i < 3; i++)
            {
                int temp = i;
                arr.Add(()=>{Console.WriteLine(temp);});
            }

            foreach (var item in arr)
            {
                item();//输出0,1,2
            }
        }
    }
}

转换为.Net1.0的代码:
[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
    // Fields
    public int temp;

    // Methods
    public void <Main>b__0()
    {
        Console.WriteLine(this.temp);
    }
}

private static void Main(string[] args)
{
    List<Action> arr = new List<Action>();
    for (int i = 0; i < 3; i++)
    {
        <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1(); //在这里实例化了三个对象
        CS$<>8__locals2.temp = i;
        arr.Add(new Action(CS$<>8__locals2.<Main>b__0));
    }
    foreach (Action item in arr)
    {
        item();
    }
}

转载于:https://www.cnblogs.com/mxw09/archive/2010/08/01/1789912.html

相关文章:

  • 巧替换windows 7中的宋体 simsun.ttc
  • JavaScript学习笔记(二)——从简单开始学起
  • 切片地图服务使用Flex API编辑和更新切图
  • 敏捷宣言创始人:十年之后看“修炼”
  • ArcSDE vs. Oracle Spatial 17
  • 【转】人际关系经验
  • ArcSDE vs. Oracle Spatial 18
  • Entity Framework Code-First(下)
  • 《ArcSDE vs. Oracle Spatial》 PDF
  • 表单向Servlet提交参数时的中文乱码问题
  • Ubuntu10.04下Zend Studio7.1.2 开发环境配置日志
  • Lucid Lynx使用感受
  • Oracle日期转换函数的格式参数大小写规则【转自ITPUB】
  • 从△走进OO,走进策略模式
  • 如何花钱让2000元的月收入工资价值最大化?
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • .pyc 想到的一些问题
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Fundebug计费标准解释:事件数是如何定义的?
  • IDEA 插件开发入门教程
  • JAVA SE 6 GC调优笔记
  • Laravel Telescope:优雅的应用调试工具
  • Leetcode 27 Remove Element
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Redis在Web项目中的应用与实践
  • Spring Boot快速入门(一):Hello Spring Boot
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 用element的upload组件实现多图片上传和压缩
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • linux 淘宝开源监控工具tsar
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #if #elif #endif
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $.proxy和$.extend
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (C)一些题4
  • (备忘)Java Map 遍历
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (区间dp) (经典例题) 石子合并
  • (转)3D模板阴影原理
  • (转)四层和七层负载均衡的区别
  • (转载)深入super,看Python如何解决钻石继承难题
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • *Django中的Ajax 纯js的书写样式1
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析