Lambda表达式(Lambda Expressions)(拉姆达表达式) 和 匿名方法 其实是一件事情。唯一的不同是:他们语法表现形式不同。Lambda 表达式是在语法方面的更进一步的进化。在本质上,他们是一件事情。他们的作用都是:产生方法。即:内联方法。Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”
Lambda 在基于方法的 LINQ 查询中用作标准查询运算符方法(如where)的参数。
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 的返回值(如果有)必须能够隐式转换为委托的返回类型。
Expression 类型。
Lambda 表达式中的变量范围规则:
-
捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
-
在外部方法中看不到 Lambda 表达式内引入的变量。
-
out 参数。
-
Lambda 表达式中的返回语句不会导致封闭方法返回。
-
continue 语句。