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     }

 

posted @ 2014-10-30 15:09  wonkju  阅读(218)  评论(0)    收藏  举报