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