c#2.0之前, 如果乙個方法或者變數需要使用委託(delegate)時, 則之前必須建立乙個命名方法, 並在需要委託的位置傳入這個名稱. 比如有乙個針對int型別的資料處理, 目的是篩選出乙個int陣列中為奇數的元素, 或者其它一些滿足條件的元素...
public class commom
}
commom類建立了乙個統一的模型, 這個模型主要用於傳入乙個delegate方法, 可以獲得這個delegate方法條件所要求的數字. 具體這個delegate方法可以寫在另乙個類中, 可以寫很多方法, 檢測是否是奇數, 是否是偶數, 這個數是否是3的倍數...這個根據需要自己寫. 這樣寫可以提高commom類的可重用程度.
//根據需要, 自己定義篩選方法
public class myintfilter
//自己定義的篩選方法2: 檢測是否是偶數
public static bool iseven(int i)
//...根據需要還可以定義其它篩選方法
}
呼叫myintfilter中的篩選方法:
int nums = ;
//篩選出奇數
int oddnums = commom.filterarrayofints(nums, myintfilter.isodd);
//篩選出偶數
int evennums = commom.filterarrayofints(nums, myintfilter.iseven);
//測試結果, 列印出oddnums和evennums
console.writeline("print oddnums:");
foreach (int i in oddnums)
console.write(i + " ");
console.writeline("print evennums:");
foreach (int i in evennums)
console.write(i + " ");
為什麼要使用匿名方法? 答: 偷懶. 為每乙個篩選策略專門寫乙個方法很多時候會令人很煩, 很多方法可能只被用到一次兩次, 且為每個方法都起乙個好聽的名字並在呼叫這些方法的時候傳入這些方法名令人不爽, 因此c#2.0的時候可以使用"匿名方法"解決這一問題:
int nums = ;
//篩選出奇數
int oddnums = commom.filterarrayofints(nums, delegate(int i)
);console.writeline("print oddnums:");
foreach (int i in oddnums)
console.write(i + " ");
這時篩選出了int陣列中所有的奇數, 而沒有使用myintfilter類裡面用於判斷是否是奇數的方法. 這種匿名的方法好處在於省去了維護程式**中上下文的精力.
lambda表示式的形式如下:
(param1, param2, param3...)=>
lambda的好處在於**? 最關鍵的作用可能是可讀性提高了, 簡潔明瞭, 只需要列出方法體中需要使用到的引數, 然後加上=>{}, 在大括號中寫方法體. 但注意的是傳入的引數型別要滿足之前delegate定義的輸入型別, 並返回delegate定義的返回型別.
同樣是上面的要求, 從int陣列中篩選出奇數, 使用lambda表示式就是這樣寫:
int nums = ;
//篩選出奇數
int oddnums = commom.filterarrayofints(nums, (i) => ((i & 1) == 1));
foreach (int i in oddnums)
console.write(i + " ");
比較三種做法, 可以發現lambda表示式最簡潔. 但並不是所有的這種情況都使用lambda表示式. 對於比較複雜的演算法, 需要重用的演算法, 最好還是使用第一種"命名方法", 因為這樣做, 在任何時候任何開發者都可以很方便的直接呼叫方法, 而不需考慮這些細節.
c#3.0很多新特性幾乎都暗示著是為linq而服務的, lambda表示式也不例外, 因為乙個linq查詢通常只需要呼叫一次, 不需要為每乙個查詢專門命名乙個方法.
C 3 0亮點 lambda表示式
c 2.0之前,如果乙個方法或者變數需要使用委託 delegate 時,則之前必須建立乙個命名方法,並在需要委託的位置傳入這個名稱.比如有乙個針對int型別的資料處理,目的是篩選出乙個int陣列中為奇數的元素,或者其它一些滿足條件的元素.public class commom commom類建立了乙...
C 3 0新特性(三) Lambda表示式
lambda表示式是乙個匿名方法,他可以包含乙個表示式或者語句塊,他能夠創造委託或表示式樹型別。demo 帶乙個引數的lambda表示式 namespace testlambda 由此可以看出,左邊x表示匿名方法的引數,右邊 x x 表示方法體 這行 可以總結為 例項化乙個委託,此委託是用計算傳入整...
C 3 0新特性(三) Lambda表示式
lambda表示式是乙個匿名方法,他可以包含乙個表示式或者語句塊,他能夠創造委託或表示式樹型別。demo 帶乙個引數的lambda表示式 namespace testlambda 由此可以看出,左邊x表示匿名方法的引數,右邊 x x 表示方法體 這行 可以總結為 例項化乙個委託,此委託是用計算傳入整...