• 使用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# 线程手册 第三章 使用线程 .NET 对同步的支持
    C# 线程手册 第三章 使用线程
    C# 线程手册 第三章 使用线程 .NET 同步策略
    C# 线程手册 第三章 使用线程 AutoResetEvent, Mutex & Interlocked
    ALinq 使用教程(七)ALinq 的扩展
    ALinq 使用教程(三)数据的增、删、改
    免费好用的 NHibernate 可视化实体代码生成器 -- Visual Entity 1.1 支持 NHibernate 了
    ALinq 使用教程(五)使用 Xml 映射文件
    致力于打造最好用的 NHibernate 设计器--Visual Entity 1.4.4发布
    将 Linq to SQl 程序转为 Linq to Access
  • 原文地址:https://www.cnblogs.com/mxw09/p/1789912.html
Copyright © 2020-2023  润新知