C# 代碼了解委托、匿名方法、Lambda 表達式和閉包本質


文本摘自: 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之前的范疇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM