除了要宣告委派類別外,同樣必須要先宣告與定義符合委派類別的方法才可以使用。
- public delegate int Calculator(int a, int b);
- public class Operator
- {
- public static int Plus(int a, int b)
- {
- return a + b;
- }
- public static int Sub(int a, int b)
- {
- return a - b;
- }
- public static int Mul(int a, int b)
- {
- return a * b;
- }
- public static int Div(int a, int b)
- {
- return a / b;
- }
- }
- public static void Main()
- {
- var calc = new Calculator(Operator.Plus);
- Console.WriteLine(calc(3,5));
- calc = new Calculator(Operator.Sub);
- Console.WriteLine(calc(3,5));
- }
如你所見,有時候我們只是需要很簡單的方法(僅僅1-2行)或是該方法僅僅只使用個1-2次,但是卻需要額外宣告方法以及包覆的類別(如Operator類別)。
那麼有沒有更簡便的寫法呢?
有,C#有提供匿名方法(Anonymous Method)的方式讓我們可以省下方法的宣告:
- public delegate int Calculator(int a, int b);
- public static void Main()
- {
- Calculator calc = delegate(int a, int b)
- {
- return a+b;
- };
- Console.WriteLine(calc(3,5));
- }
在第4行時就是使用匿名方法的方式,直接定義出一個方法以及其主體(return a + b)。
如此在使用委派時就可以隨時定義出想使用的方法。
不過...這樣就結束了嗎? 還沒呢!! C#還提供更懶人的方式:Lambda Expression
第4行的(int a, int b) => { return a+b; }; 即是lamdba expression。
- public delegate int Calculator(int a, int b);
- public static void Main()
- {
- Calculator calc = (int a, int b) => { return a+b; };
- Console.WriteLine(calc(3,5));
- }
左邊的 (int a, int b) 表示方法的輸入參數,
中間的 => 即是lamdba expression的關鍵語法。
右方的 { return a+b; } 則是方法的主體。
整體來說這跟匿名方法有些相似,同樣都沒有方法名稱、輸入與輸出都一模一樣,唯一的差別就是少了關鍵字delegate以及多了 => 符號。
Lambda expression可不只這樣。
首先我們可以知道此Lambda expression會指派給Calculator委派,該委派的方法簽章是輸入兩個int並且回傳一個int。
因此藉由型別推斷,編譯器可以知道Lambda expression的輸入與輸出的型別。
所以左方的(int a, int b)可以省略型別宣告:
- Calculator calc = (a, b) => { return a+b; };
其次,因為方法主體只有一行而已,而且也只有單一動作,所以程式碼區塊的大括號{}以及return關鍵字也可以省略,編譯器會知道a+b就是回傳值。
如此,是不是比匿名方法簡潔許多呢?
- Calculator calc = (a, b) => a+b;
唯一的缺點就是跟以往的語法相比相差比較大,初次接觸lambda expression的人會需要一段時間熟悉。
另外,如果方法的傳入參數只有一個的話,連左邊的小括號也可以省略。例如Linq的Where方法:
- var list = new List
{1,2,3,4,5}; var list2 = list.Where(x => x > 3);