首页 > 代码库 > 匿名方法

匿名方法

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)

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

匿名方法