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

浙公网安备 33010602011771号