λ表达式是C#3.0的内容。
λ表达式用于简化C#编程的某些方面,尤其是与LINQ合并的方面。
把λ表达式用于匿名方法:
例:
myTimer.Elapsed += (source, e) => Console.WriteLine("Event handler called after {0} milliseconds.", (source as Timer).Interval );
//应用λ表达式。(source, e)参数应用了匿名类型,会根据上下文推到类型。=>把参数列表 和 表达式体分开。
可以代替内联的匿名方法:
myTimer.Elapsed += delegate(object source, ElapsedEventArgs e)
{Console.WriteLine("Event handler called after {0} milliseconds.", (source as Timer).Interval );};
这两段代码会被编译为相同 或 相似 的 MSIL代码。
λ表达式的参数:
上面的(source,e)采用了匿名类型。实际上也可以定义类型如: (int paramA , int paramB)=> paramA+ paramB
但不可以(int paramA, paramB)=>....., 只能要么全部指定类型,要么全部采用匿名类型。 不能混用。
如果,只有一个参数可以省略(),如: param1 => param1*param1
还可以,定义 无参数 的λ表达式,使用空括号来表示:() => Math.PI
λ表达式的语句体:
多行表达式时如下:
(param1, param2)=>
{
// 多行表达式
return returnvalue; //如果有返回类型,可以使用return语句。
}
例:
PerformOperations((int paramA, int paramB)=>param1+param2);
可以改写为:
performOperations(delegate(int paramA, int paramB) {return paramA+ paramB;});
还可改写为:
performOperations((int paramA, int paramB) => { return paramA+paramB;});
单一表达式时,使用λ表达式比较简单。多个语句是,建议使用非匿名方法,这便于代码重用。
λ表达式用做委托 和 表达式树:
λ表达式有两种解释:
·i 解释为 委托 (如上面所描述的一样)
一般可以把拥有至多4个参数 的表达式 表示为如下 泛型类型:
·Action<>表示 不带 参数, 返回 void
·Action<>表示 至多4个参数, 返回 void
·Func<>表示 至多5个参数,返回非 void类型 。 返回类型放在参数列表最后。
如:Func<int, int, int> 意思是,有两个int参数,返回类型是int。
·ii 解释为 表达式树(与LINQ关系密切)
表达式树 是 λ表达式 的抽象表示,但不能直接执行。可以使用表达式树已编程方式分析λ表达式,执行操作,以响应λ表达式。
例:
LINQ架构包含一个泛型类Expression<>,用于封装λ表达式。
使用这个类的一种方式是提取C#编写的λ表达式,把它转换为等价的SQL脚本,以便在数据库中直接执行。
λ表达式 和 集合:
学习Func<>泛型委托后,理解System.Linq空间中为数组提供的扩展方法。例Aggregate()定义的其中一个版本:
public static TSource Aggregate <TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func );
调用:
int[] myIntArray = {2,6,3};
int result = myIntArray.Aggregate((param1, param2)=>param1+param2);
//这个表达式会使 λ表达式调用两次(有三个数,先计算2+6,再计算8+3)。最后result=11
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/allovermine/archive/2009/11/24/4862887.aspx