• 使用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#4.0泛型接口和泛型委托的协变和逆变
    编码解析
    SQL入门(2)
    SQL入门(1)补充
    ADO两种连接方式
    SQL入门(3)
    ADO中SqlCommand的三种执行
    Huffman编码
    IE8单独样式错乱
    从 button列表中获得 commandrgument值
  • 原文地址:https://www.cnblogs.com/mxw09/p/1789912.html
Copyright © 2020-2023  润新知