zoukankan      html  css  js  c++  java
  • 使用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();
        }
    }
  • 相关阅读:
    c语言分支和循环语句
    C语言基础知识
    磁盘管理-fdisk
    搭建Discuz
    KVM创建虚拟机相关操作
    WINRAR exe 捆绑 小游戏
    linux vi编辑器&文件目录管理
    灰鸽子木马的功能体验
    sqlalchemy 级联删除
    sqlalchemy 多对多
  • 原文地址:https://www.cnblogs.com/mxw09/p/1789912.html
Copyright © 2011-2022 走看看