Lambda表达式 - 浅谈

时间:2023-01-03 16:51:40

概述:

  只要有委托参数类型的地方,就可以使用 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;
}
}