1. 程式人生 > 其它 >C# 從0到實戰 lambda表示式和Expression-bodied表示式

C# 從0到實戰 lambda表示式和Expression-bodied表示式

什麼是lambda表示式(λ表示式)

用過其他函式式語言的人可能對閉包和惰性計算很熟悉,沒有用過的人也多多少少的聽說過Lambda表示式。那麼到底什麼是lambda表示式呢?按我的看法是建立一個匿名的函式物件,從而達到簡化程式碼的目的。以下是lambda表示式的用法:

(arg_1,...)=>{ //codes }

 Lambda表示式有時在某些資料上也被稱為 箭頭函式。

lambda和閉包

要搞清楚lambda表示式的作用,記得搞清楚什麼是閉包?所謂閉包,引用 《JavaScript 高階程式設計》 中的一句話來解釋它:“閉包是指有權訪問另一個函式作用域中的變數的函式”。按我自己的理解就是在一個父函式中返回一個子函式

,具體如下:

//...

Object  demo(arg_1)  {
    return (arg_1)=>{ return PI;}
}

//..

這樣就可以達到少定義一個函式/方法的目的,讓程式碼更乾淨(clean)。

由於C#7.0以及之前的版本都不能像go語言一樣返回多個值,所以沒有辦法完全發揮閉包的優勢;然而自從C#7.1開始支援元組,可以返回一個值型別的物件。所以上面的例子還可以改寫:

//...

Object (double v_1, double v_2)  demo(arg_1,arg_2)  {
    return (arg_1)=> { return (PI,PI);}
}

//..

 

高階函式

高階函式就是可以將一個函式作為物件傳遞給另一個函式。如果有對其他語言或者對C#有所瞭解,就會想起了委託——另一個將函式作為物件傳遞給函式的方式,即使是C/C++也有對應的函式指標和委託構造方法(C++17)與之類似.

高階函式在C#裡面就是傳遞一個Lambda表示式作為引數,這麼做的好處是可以讓程式碼更簡潔,典型的例子就是Javascript 的JQERY的使用方法了,然而在C#中的寫法是這樣的:

//...

Object  demo(arg_1)  {
   Console.WirteLine(arg_1);
}

//..

//使用表示式方式呼叫 
demo(x=>"hello
") ; //使用程式碼塊方式呼叫 demo(x=>{return "hello"}) ;