天天看點

匿名函數

匿名函數(Anonymous Function)是表示“内聯”方法定義的表達式。匿名函數本身及其内部沒有值或者類型,但是可以轉換為相容的委托或者表達式樹類型(了解詳情)。匿名函數轉換的計算取決于轉換的目标類型:如果是委托類型,則轉換計算為引用匿名函數所定義的方法的委托;如果是表達式樹類型,則轉換将計算以對象結構形式表示方法結構的表達式樹。 

匿名函數有兩種文法風格:Lambda表達式(lambda-expression)和匿名方法表達式(anonymous-method-expression)。在幾乎所有的情況下,Lambda表達式都比匿名方法表達式更為簡介具有表現力。但現在C#語言中仍保留了後者,為了向後相容。

匿名函數有兩種形式:lambda表達式、匿名方法

ambda表達式: 

async可選 (匿名的函數簽名)=> (匿名的函數體) 

匿名方法表達式: 

async可選 delegate (顯式的匿名函數簽名) 可選{代碼塊}

匿名方法(Anonymous methods) 提供了一種傳遞代碼塊作為委托參數的技術。匿名方法是沒有名稱隻有主體的方法

匿名函數是通過使用 delegate 關鍵字建立委托執行個體來聲明的。例如:

using System;

namespace niminghanshu

{

delegate void test();//聲明委托

class Program

static void Main(string[] args)

//匿名函數格式 delegate(參數清單){代碼塊};

}

注意: Console.WriteLine("hello,world");是匿名函數的主體;

如果要使用有參數或有傳回值的匿名函數就必須聲明對應類型的委托:

把上面的例子改一下:

delegate int test(int a);//聲明委托

test aa = delegate (int number)

Console.WriteLine("hello,world"); 

return number; 

};

int numbers = aa(10);

Console.ReadKey();

     

Lambda表達式和匿名方法表達式的差別: 

● 當沒有參數的時候,匿名方法表達式允許完全省略參數清單,進而可以轉換為具有任意值參數清單的委托類型,Lambda表達式則不能省略參數清單的圓括号()。 

● Lambda表達式允許省略和推斷類型參數,而匿名方法表達式要求顯式聲明參數類型。 

● Lambda表達式主體可以為表達式或者代碼塊,而匿名方法表達式的主體必須為代碼塊。 

● 隻有Lambda表達式可以相容到表達式樹類型。

值得注意的是:匿名方法主體後面都以“;”結尾。

本文轉自 甯金峰 51CTO部落格,原文連結:http://blog.51cto.com/13243523/2043412,如需轉載請自行聯系原作者