概述:
只要有委托参数类型的地方,就可以使用 Lambda表达式.在讲述Lambda表达式之前,有必要先简要说明一下 委托中的"匿名方法":
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace AnonymousMethod {
class Program {
static void Main(string[] args) {
string midStr = " middle ";
Func<string, string> strDel = delegate(string strParam) { //通过匿名方法代替事先写好的方法来实例化委托.
strParam += midStr;
strParam += " end.";
return strParam;
}; string result = strDel("begin ");
Console.WriteLine(result);
//begin middle end.
}
}
}
对于只执行一次,而且方法的实现比较简单,我们使用匿名方法代替事先写好的方法,然而从 C#3.0开始,我们可以使用 Lambda表达式来代替匿名方法.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace LambdaExpression {
class Program {
static void Main(string[] args) {
string midStr = " middle ";
Func<string, string> strDel = strParam => { //使用Lambda表达式.
strParam += midStr;
strParam += " end.";
return strParam;
}; string result = strDel("begin ");
Console.WriteLine(result);
//begin middle end.
}
}
}
Lambda运算符"=>"的左边列出了需要的参数;右边定义了赋予Lambda变量的方法的实现代码.
参数
如果只有一个参数,只写出参数名就可以.如上面的例子,因为委托类型定义了一个 string参数,所以 strParam的类型就是string类型.
如果使用多个参数,就要把参数名称放在括号中.如
//多个参数.
Func<double, double, double> twoParam = (x, y) => x + y;
double result = twoParam(, );
Console.WriteLine(result);
//
多行代码
如果Lambda表达式只有一条语句,在方法块内就就不需要花括号和return语句,因为编译器或添加一条隐式的return语句.如上例子.但是如果Lambda表达式的实现代码需要多条语句时,就必须添加花括号和return语句,例如:
string midStr = " middle ";
Func<string, string> strDel = strParam => { //Lambda表达式的实现代码有多条语句.
strParam += midStr;
strParam += " end.";
return strParam;
};
Lambda表达式外部的变量
Lambda表达式可以访问Lambda表达式块外部的变量,如
int someVal = ;
Func<int, int> f = x => x + someVal;
int retult = f();
Console.WriteLine(retult);
//6.
代码中的第2行,编译器会在后台生成一个匿名类,有一个构造函数来传递外部变量,如
public class AnonymousClass {
private int someVal;
public AnonymousClass(int someVal) {
this.someVal = someVal;
} public int AnonymousMethod(int x) {
return x + someVal;
}
}