Lambda表达式(Lambda Expressions)(拉姆达表达式) 和 匿名方法 其实是一件事情。唯一的不同是:他们语法表现形式不同。Lambda 表达式是在语法方面的更进一步的进化。在本质上,他们是一件事情。他们的作用都是:产生方法。即:内联方法。Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”

Lambda 在基于方法的 LINQ 查询中用作标准查询运算符方法(如where)的参数。

LAMBDA表达式:

表达式在右边的 Lambda 表达式称为“Lambda 表达式”。 Lambda 表达式在构造表达式树时广泛使用。 Lambda 表达式返回表达式的结果,并采用以下基本形式:

 



(input parameters) => expression
//多参数的可以是
(x, y) => x == y;

(int x, string s) => s.Length > x



LAMBDA语句:



delegate void TestDelegate(string s);
TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); };
myDel("Hello");



 

自定义动态LAMBDA表达式:

Func是一个delegate的泛型,实例化该泛型的是具有一个int类型参数,返回布尔类型的方法。

Expression<Func<int,bool>> 表示可以执行任意的方法,定义完成后可以使用Compile来进行编译,如果编译成功便可以执行。

可以自定义动态的lambda表达式如:



1  // a*b+2
 2             ParameterExpression paraLeft = Expression.Parameter(typeof(int), "a");
 3             ParameterExpression paraRight = Expression.Parameter(typeof(int), "b");
 4 
 5             BinaryExpression binaryLeft = Expression.Multiply(paraLeft, paraRight);
 6             ConstantExpression conRight = Expression.Constant(2, typeof(int));
 7 
 8             BinaryExpression binarybody = Expression.Add(binaryLeft, conRight);
 9 
10             // Expression<Func<int, int, int>> lambda = (a, b) => a * b + 2;
11             Expression<Func<int, int, int>> lambda = Expression.Lambda<Func<int, int, int>>(binarybody, paraLeft, paraRight);//表达式树
13 
14             Func<int, int, int> myfunction = lambda.Compile();
15             int result = myfunction(10, 20);



 

Lambda 的一般规则如下:

  • Lambda 包含的参数数量必须与委托类型包含的参数数量相同。
  • Lambda 中的每个输入参数必须都能够隐式转换为其对应的委托参数。
  • Lambda 的返回值(如果有)必须能够隐式转换为委托的返回类型。

请注意,Lambda 表达式本身没有类型,因为常规类型系统没有“Lambda 表达式”这一内部概念。但是,有时会不正式地论及 Lambda 表达式的“类型”。 在这些情况下,类型是指委托类型或 Lambda 表达式所转换为的 Expression


Lambda 表达式中的变量范围规则:

  • 捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
  • 在外部方法中看不到 Lambda 表达式内引入的变量。
  • Lambda 表达式无法从封闭方法中直接捕获 ref 或 out
  • Lambda 表达式中的返回语句不会导致封闭方法返回。
  • Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue