.NET Lambda

 

  • Lambda概述
     lambda 表達式是一個可用於建立委託或表達式樹類型的匿名函數。 經過使用 lambda 表達式,能夠可做爲參數或返回編寫本地函數,該函數調用的值。 Lambda 表達式用於編寫 LINQ 查詢表達式特別有用。
     若要建立 lambda 表達式,則在 lambda 運算符 =>的左側指定輸入參數 (若是有),所以,您放置表達式或語句在另外一端塊。 例如,lambda 表達式 x => x * x 指定名爲 x 的參數並返回 x 的值計算的。
     => 運算符具備與賦值運算符 (=) 相同的優先級,而且是右結合運算符。Lambda 在基於方法的 LINQ 查詢中用做標準查詢運算符方法(如 Where)的參數。在 is 或 as 運算符的左側不容許使用 Lambda。適用於匿名方法的全部限制也適用於 Lambda 表達式。
     只有在 Lambda 有一個輸入參數時,括號纔是可選的;不然括號是必需的。兩個或更多輸入參數由括在括號中的逗號分隔。
  • Lambda表達式
(input parameters) => expression
() => SomeMethod()
(input parameters) => {statement;}
  • 表達式傳遞給委託類型
delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}
  • 表達式樹類型
using System.Linq.Expressions;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Expression<del> myET = x => x * x;
        }
    }
}
  • 標準查詢運算
     許多標準查詢運算符都具備輸入參數,其類型是泛型委託的 Func<T, TResult> 系列的其中之一。 Func<T, TResult> 委託使用類型參數定義輸入參數的數目和類型,以及委託的返回類型。 Func 委託對於封裝應用於一組源數據中每一個元素的用戶定義表達式很是有用。 
public delegate TResult Func<TArg0, TResult>(TArg0 arg0)
Func<int, bool> myFunc = x => x == 5;
bool result = myFunc(4);
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);
var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);
  • 變量範圍
    • 捕獲的變量將不會被做爲垃圾回收,直至引用變量的委託超出範圍爲止。
    • 在外部方法中看不到 Lambda 表達式內引入的變量。
    • Lambda 表達式沒法從封閉方法中直接捕獲 ref 或 out 參數。
    • Lambda 表達式中的返回語句不會致使封閉方法返回。
    • Lambda 表達式不能包含其目標位於所包含匿名函數主體外部或內部的 goto 語句、break 語句或 continue 語句。
相關文章
相關標籤/搜索