zoukankan      html  css  js  c++  java
  • C# 匿名方法本质

    匿名方法

    匿名方法与具名方法在本质上是相同的,使用匿名方法后编译器在定义匿名方法的类的外部动态生成具名方法。

      /// <summary>
        /// 定义委托
        /// </summary>
      delegate void DoWorkDelegate();

    class Program
        {
            static void Main(string[] args)
            {
                //具名方法的委托
                DoWorkDelegate doWorkName=new DoWorkDelegate (DoWorkWithName);
               
                //匿名方法的委托
                DoWorkDelegate  doWorkNoName=delegate()
                {
                    Console.WriteLine("DoWorkDelegate AnonymousDelegate");
                };

                Console.Read();
                
            }

            /// <summary>
            /// 具名方法
            /// </summary>
            static void DoWorkWithName()
            {
                Console.WriteLine("DoWorkDelegate AnonymousDelegate");
            }
        }

    使用ildasm打开程序集后可以看到:
    Program下有两个静态方法
    .method private hidebysig static void  DoWorkWithName() cil managed
    {
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "DoWorkDelegate AnonymousDelegate"
      IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method Program::DoWorkWithName

      '<Main>b__0' 为编译器在后台为匿名方法生成的静态方法
    .method private hidebysig static void  '<Main>b__0'() cil managed
    {
      .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "DoWorkDelegate AnonymousDelegate"
      IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method Program::'<Main>b__0'

    委托初始化产生的IL代码如下:

    委托使用具名方法实例化:
     IL_0002:  ldftn      void AnonymousDelegateApp.Program::DoWorkWithName()
      IL_0008:  newobj     instance void AnonymousDelegateApp.DoWorkDelegate::.ctor(object,
                                                                                    native int)

    委托使用匿名方法实例化:
    IL_0016:  ldftn      void AnonymousDelegateApp.Program::'<Main>b__0'()
    IL_001c:  newobj     instance void AnonymousDelegateApp.DoWorkDelegate::.ctor(object,
                                                                                    native int)

    由此可见匿名方法与具名方法本质上没有任何区别,匿名方法只是编译器在后台动态产生了具名方法,使用匿名方法或具名方法实例化委托时,
    两者产生的Il代码是完全一致的。







  • 相关阅读:
    软件工程 团队博客第二阶段成绩
    现代软件工程 10 绩效管理
    现代软件工程讲义 1 软件工程概论
    现代软件工程讲义 0 教学方法
    软件工程 敏捷的酒后问答
    我传递了错误的信息
    起跑点上
    输在起跑点上?
    好可怕的假相
    浪子回头
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1966438.html
Copyright © 2011-2022 走看看