文本摘自: http://www.cnblogs.com/max198727/p/3436220.html
1. 三種實現委托的方法
下面先從一個簡單的例子比較命名方法,匿名方法和 Lambda 表達式三種實現委托的方法
(1)申明一個委托,當然這只是一個最簡單的委托,沒有參數和返回值,所以可以使用Action 委托
1 delegate void DelegateTest();
(2)創建一個靜態方法,以作為參數實例化委托
1 static void DelegateTestMethod() 2 { 3 System.Console.WriteLine("命名方式"); 4 }
(3)在主函數中添加代碼
1 //命名方式 2 DelegateTest dt0 = new DelegateTest(DelegateTestMethod); 3 //匿名方法 4 DelegateTest dt1 = delegate() 5 { 6 System.Console.WriteLine("匿名方法"); 7 }; 8 //Lambda 表達式 9 DelegateTest dt2 = ()=> 10 { 11 System.Console.WriteLine("Lambda 表達式"); 12 }; 13 dt0(); 14 dt1(); 15 dt2(); 16 System.Console.ReadLine();
輸出:
命名方式
匿名方法
Lambda 表達式
說明
通過這個例子可以看出,三種方法中命名方式是最麻煩的,代碼也很臃腫,而匿名方法和 Lambda 表達式則直接簡潔很多。這個例子只是實現最簡單的委托,沒有參數和返回值,事實上 Lambda 表達式較匿名方法更直接,更具有表達力。
那么 Lambda 表達式除了書寫方式和匿名方法不同之外,還有什么不一樣的地方嗎?
無論是用匿名方法還是Lambda 表達式實現的委托,其本質都是完全相同。他們的原理都是在C#語言編譯過程中,創建了一個靜態的方法實例委托的對象。也就是說匿名方法和Lambda 表達式在CIL中其實都是采用命名方法實例化委托。
2. 研究帶有參數的委托
2.1 研究采用匿名方法實現委托的方式,將代碼改為:
1)將委托改為
1 delegate void DelegateTest(string msg);
2)將主函數改為
1 DelegateTest dt = delegate(string msg) 2 { 3 System.Console.WriteLine(msg); 4 }; 5 dt("Just for test");
輸出結果
Just for test
2.2 研究采用 Lambda 表達式實現委托的方式,將代碼改為:
1)定義一個委托
1 delegate void DelTest(int n);
2)在主函數中添加中添加代碼
1 int t = 10; 2 DelTest delTest = (n) => 3 { 4 System.Console.WriteLine("{0}", t + n); 5 }; 6 delTest(100);
輸出結果
110
結論
C#在實現匿名函數(匿名方法和Lambda 表達式),是通過隱式的創建一個靜態方法或者類(需要捕獲變量時),然后通過命名方式創建委托。
本文到這里筆者已經完成了對匿名方法,Lambda 表達式和閉包的探索, 明白了這些都是C#為了方便用戶編寫代碼而准備的“語法糖”,其本質並未超出.Net之前的范疇。