程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> [C#] C# 知識回顧,

[C#] C# 知識回顧,

編輯:關於.NET

[C#] C# 知識回顧,


C# 知識回顧 - Lambda

Lambda 表達式

  • Lambda 語句
  • 異步 Lambda
  • 在 LINQ 中使用 Lambda
  • Lambda 中的類型推斷
  • Lambda 中的變量使用范圍
  • Lambda 的特點
  •  

    Lambda 簡介

      Lambda 表達式,是一種簡化的匿名函數,可用於創建委托或表達式目錄樹。其次,你也可以將 Lambda 表達式作為參數進行傳遞,或者將它作用於函數調用值調用後返回的一個函數來使用。我們經常在 LINQ 中使用 Lambda 表達式。

      創建 Lambda 表達式的簡單語法形式:輸入參數 => 表達式或語句塊。其中,=> 為 Lambda 運算符,可讀作“goes to” 。

        delegate int MyDel(int x);  
        static void Main(string[] args)  
        {  
            MyDel myDel = x => x++;  
            var j = myDel(5); 
        }  

     

      創建表達式樹:

      Expression<MyDel> myDel = x => x++;  

     

      => 運算符和 = 運算符 (賦值運算符),具有相同的優先級,並且都是右結合運算。

      我們經常在 LINQ 查詢中使用 Lambda 表達式,如作為 Where<TSource> 的參數。該方法有多個重載,這裡只列舉了其中一個。

     1         //
     2         // 摘要: 
     3         //     基於謂詞篩選值序列。
     4         //
     5         // 參數: 
     6         //   source:
     7         //     要篩選的 System.Collections.Generic.IEnumerable<T>。
     8         //
     9         //   predicate:
    10         //     用於測試每個元素是否滿足條件的函數。
    11         //
    12         // 類型參數: 
    13         //   TSource:
    14         //     source 中的元素的類型。
    15         //
    16         // 返回結果: 
    17         //     一個 System.Collections.Generic.IEnumerable<T>,包含輸入序列中滿足條件的元素。
    18         //
    19         // 異常: 
    20         //   System.ArgumentNullException:
    21         //     source 或 predicate 為 null。
    22         public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

     

      參數是委托類型 Func<TSource, bool> predicate),這裡使用 Lambda 表達式進行創建我想應該是最合適的。還有,假如參數類型為抽象類的 System.Linq.Expressions.Expression<Func>,其中 Func 委托是重載具有十六個參數的,你也可以使用 Lambda 表達式創建對應的表達式樹。

      【注意】在 is 或 as 運算符的左側不允許使用 Lambda 表達式。

     

    Lambda 表達式

      表達式在 => 運算符右側,稱“lambda 表達式”。lambda 表達式常用於 LINQ 和構建表達式樹,它也允許返回結果。

      基本形式:( 輸入參數 ) => 表達式 。

      如:  

      ( ) => true;
       x => x == 1;   (x) => x == 1;   (x, y) => x == y;

     

      【備注】當 lambda 表達式有且只有一個輸入參數的時侯,括號(“()”)才是可選的。 括號內存在多個輸入參數時使用“,”進行分割。

     

      你也可以選擇顯式指定類型,一般只有在編譯器難以或無法准確推斷輸入類型的時候。

      Func<int, int, bool> func = (int x, int y) => x == y;
    

     

      這裡使用空括號(“()”)指定零個輸入參數,並且可以在 Lambda 的主體包含一個或多個方法進行調用。

      () => YourMethod()  

     

    Lambda 語句

      lambda 語句和上面的 lambda 表達式相比,只是多了個大括號(“{ }”)。  

      基本形式:( 輸入參數 ) => { 表達式 } 。

     

      lambda 語句的主體可以由任意數量的普通語句組成,不過,我們一般寫的語句不多(三個左右吧)。

    delegate void MyDel(string s);  
    
    // ...
    
    MyDel myDel = n => { var s = n + " Fanguzai!"; Console.WriteLine(s); };  
    myDel("Hi,");  

     

    異步 Lambda

      通過 async 和 await 關鍵字,我們可以很簡單並快速的創建包含異步處理的 lambda 表達式和語句。博主發表了約 8 篇關於異步的文章,你可以 點擊進入目錄 。

      這裡,我使用簡單的異步調用方式,編寫執行按鈕觸發的點擊事件,即調用異步方法 DoAsync

    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
        }  
      
        private async void button1_Click(object sender, EventArgs e)  
        {  
            await DoAsync();  
        }  
      
        async Task DoAsync()  
        {  
            await Task.Delay(250);  
        }  
    } 

      

      現在,簡化上面的的 Click 事件,並加上 async。

    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
            button1.Click += async (sender, e) =>  
            {  
                await DoAsync();  
            };  
        }  
      
        async Task DoAsync()  
        {  
            await Task.Delay(250);  
        }  
    }  

     

    在 LINQ 中使用 Lambda

      許多 LINQ 中的參數都是一種委托類型的參數,如 Func<T, TResult>,可以定義輸入參數以及返回類型。博主也發表了多篇關於 LINQ 的文章,你也可以 點擊進入目錄 。

      public delegate TResult Func<TArg0, TResult>(TArg0 arg0)  

     

      Func<int, bool> 表示:int 為輸入參數,bool 為返回值。

      Func<int, int, bool> 表示:2個 int 為輸入參數,一個 bool 為返回值。

      示例:

      Func<int, bool> myFunc = x => x == 250;  
      var result = myFunc(1314); 

     

      C# 的編譯器可以自動推斷輸入參數的類型,即便是多個輸入參數,當然,你也可以選擇顯式指定。

      var nums = new[] { 2, 5, 0 };
      var query = nums.Count(x => x > 2);
      var query2 = nums.Count<int>(x => x < 2);

     

      【備注】不要將 => 和 >= 搞錯了,前者是 Lambda 運算符,後者是算術比較運算符。

      

    Lambda 中的類型推斷

      編譯器會根據 Lambda 主體、參數的委托類型以及 C# 語言規范和其它等一些因素,對我們所寫的 Lambda 進行類型推斷。

    Lambda 中的變量使用范圍

      我們可以在 Lambda 的主體中引用范圍之外的變量。如:

      var nums = new[] { 2, 5, 0 };   //int[] 類型
      var compareNum = 2.5;
      var query = nums.Count(x => x == compareNum);

     

    Lambda 的特點

    • Lambda 中包含輸入參數的數量,必須與委托類型包含的參數數量一致。

    • Lambda 中的每個輸入參數,必須都能夠通過隱式轉換為其對應的委托參數類型。

    • Lambda 中的返回值(如果有),必須能夠隱式轉換為委托的返回類型。

     

    C# 基礎回顧系列

      《C# 知識回顧 - 序列化》

      《C# 知識回顧 - 表達式樹 Expression Trees》

      《C# 知識回顧 - 特性 Attribute》、《剖析 AssemblyInfo.cs - 了解常用的特性 Attribute》

      《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》

      《C# 知識回顧 - 事件入門》、《C# 知識回顧 - Event 事件》

      《string 與 String,大 S 與小 S 之間沒有什麼不可言說的秘密》

      《C# 知識回顧 - 你真的懂異常(Exception)嗎?》

      《了解過入口函數 Main() 嗎?帶你用批處理玩轉 Main 函數》

      《C# 基礎回顧 - 匿名方法》

     

    錯誤修正

      @likeheart :“半年命” -> “半條命”。詳見評論區 10L。

     

     


    【博主】反骨仔

    【原文】http://www.cnblogs.com/liqingwen/p/6216582.html 

    【參考】微軟官方文檔

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved