LAMBDA表达式剖析

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

  Lambda表达式减少了重复数据的工作量。所有可列举数据是通过使用一个SQL-like 查询语法(一种看起来像SQL的查询,但不同于它)的LINQ来查询的。 LINQ 内置机制将循环枚举数据,并且使用一定的条件构成条件语句过滤数据。LINQ查询效率非常高。 Lambda表达式也是以类似的方式工作。一些现有的扩展方法内嵌Lamdba表达式来执行某些操作, 并且使重复操作变得更容易。我们将很快看到。Lambda表达式能够不需要扩展方法,但是这是现在通常的用法。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 表达式无法从封闭方法中直接捕获 refout 参数。

  • Lambda 表达式中的返回语句不会导致封闭方法返回。

  • Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。


posted on 2012-04-06 16:15  小茶喏  阅读(1564)  评论(0编辑  收藏  举报

导航