Lambda表达式
定义:
Lambda表达式是一个匿名函数,可以包含表达式和语句,可以用来创建委托或expression tree。
所有Lambda表达式者采用用lambda操作符=>(读做“goes to”),左边表示输入参数,右边为表达式或语句块。
用法
1,创建委托
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 }
2, 创建expression tree类型
using System.Linq.Expressions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Expression<del> myET = x => x * x; } } }
Expression Lambdas
右边为括表达式的Lambda表达式称为“表达式lambda”。这个有点绕,MSDN原文如下:
A lambda expression with an expression on the right side is called an expression lambda.
下面是一些expression lambda示例
(x, y) => x == y (int x, string s) => s.Length > x () => SomeMethod() x => x + 1 //只有当参数为一个时,()才可以省略
Statement Lambdas
与“表达式lambda”类似,只不过多了一个{};
(input parameters) => {statement;}
实例分析
builder.Register(ctx => RouteTable.Routes).SingleInstance()
//Register定义 public static IRegistrationBuilder<T, SimpleActivatorData, SingleRegistrationStyle> Register<T>(this ContainerBuilder builder, Func<IComponentContext, T> @delegate);
注:builder = new ContainerBuilder();
注:代码截取自Orchard Global.asax.cs
初看有点犯晕,ctx在这起什么作用?这段代码应如何理解?下面是我的理解。
ctx在此完全是因为IRegistrationBuilder中定义的 Func<IComponentContext, T>必须要有一个输入参数,在右边的Lambda表达式(RouteTable.Routes)中并没有用到这个参数。代码的意思就是把Routes注册到容器中。
签名:删除冗余的代码最开心,找不到删除的代码最痛苦!