匿名方法

1. 匿名方法

 //定义一个委托类型
    delegate void Show(string content);

    static void TestAnnoyMethod()
        {
            Show sw = delegate(string con)
            {
                Console.WriteLine("直接使用匿名方法");
            };
     
            //有参数的匿名方法
            InvokeMethod(delegate(string str) { Console.WriteLine("带有参数的匿名方法"); });
            
            //无参数的匿名方法
            InvokeMethod(delegate { Console.WriteLine("无参数的匿名方法"); });
            
            Show sw2 = delegate
            {
                Console.WriteLine("直接无参数的匿名方法");
            };

        }
        static void InvokeMethod(Show sw)
        {
            sw("利用委托执行匿名方法");
        }

2 本质分析

   编译后的代码:

   

  通过查看分析IL中的代码可知:

  匿名方法的本质:一个委托对象 和一个编译器自动命名的静态方法

  针对如下的代码:

Show sw = delegate(string con)
            {
                Console.WriteLine("直接使用匿名方法");
            };

  编译器在编译的时候,把该匿名方法编译成一个静态的委托对象(private static Show CS$<>9_CachedAnonymousMethodDelegate4;)和

  一个静态的方法:

private static void <TestAnnoyMethod>b__0(string con)
{
    Console.WriteLine("直接使用匿名方法");
}

然后用该静态方法初始化其静态的委托对象,最后把该静态委托对象赋值给委托变量(Show sw)

 同时,我们可以看到匿名方法可以省略参数,这是因为我们把匿名方法赋值给委托,编译器会自动根据委托类型的定义“推算”出相应的参数。

posted @ 2014-10-28 21:06  透明雨  阅读(153)  评论(0编辑  收藏  举报