1. 程式人生 > >C#匿名型別及Lambda方法

C#匿名型別及Lambda方法

一、匿名型別產生的背景

  C#是一種強型別語言,即每個變數都必須在使用前宣告其資料型別,無論是語言內建的型別還是自定義型別。而我們瞭解在許多其他語言中變數是可以“直接使用的”,即無需宣告,由編譯器決定變數識別符號,例如Matlab,Javascript,Lisp等。不知道是不是因為Linq中對查詢語句的革新,使得匿名型別開始凸顯價值。匿名方法,即Lambda表示式,是提高編碼效率的一大利器,它的出現讓你不再費勁腦汁為那些臨時性的函式起名字。

二、語法

  1、定義匿名變數

   var 變數名 = new {初始化語句};

  var 變數名 = new[] {初始化語句};

  匿名型別直接繼承至System.Object,編譯器會將其編譯為只含屬性的型別,並自動為其重寫Object型別的ToString()方法。另外,若初始化語句中屬性的名稱、數量完全一致,則編譯器會將多個這樣的匿名變數編譯為同一個型別。

    var myAnony1 = new {Id = 1, Name = "tang", Age = 28}; //考慮到元素都是屬性,故命名時建議以大些字母開頭
    var myAnony2 = new {Id = 2, Name = "xiao", Age = 26}; //此處兩個匿名變數會被編譯為同一型別
    var peoples = new[] {new {Name = "LiMing", Age = 30},
                         new {Name = "LiuYangshu", Age = 23}}; //此處定義一個匿名陣列

  2、定義Lambda表示式

  引數列表 => 函式體表達式

  其中引數列表可以是多個引數或為空,例如(i),(i,j),(),分別定義了1個、兩個和空引數列表(當引數只有一個時,括號可以去掉);同時引數可以是顯式定義和隱式定義的,上例中的引數都是隱式的。顯式定義的例子如下:(int i),(int i, int j);

  函式體表達式中可以有多條語句。如果有多條語句需用{}將其包括其中(與if表示式類似)。

  通常Lambda表示式用在代表(delegate)中傳遞特定方法例項的地方。例如

List<int> evenNumbers = list.FindAll(i => (i % 2) == 0); //等於List<int> evenNumbers = list.FindAll(delegate(int i) { return (i % 2) == 0; } );