Lambda表达式可以简化C#编程的某些方面,用法非常灵活。因此也不容易掌握。

下边是我学Lambda表达式的一点记录。

1、Lambda表达式是与委托紧密联系的。只要有委托参数类型的地方,就可以使用Lambda表达式。

Lambda表达式的运算符是=>。运算符左边列举出了需要的参数,右边定义了赋予Lambda变量的方法的实现代码。下面这段代码是一个最简单的使用方法:

public class MyLambda
{
public void disPlay()
{
string mid = ",middle part,";
Func<string, string> lambda = param =>
{
param += mid;
param += "and this was added to the string";
return param;
};
Console.WriteLine(lambda("Start of string"));
}
}

Func<string, string>是一个委托类型。包含两个参数:一个输入的string和一个输出的string.

parm是输入参数,所以他的类型可以认为是string类型的(当然很多地方会出现没有名字的类型的)。

运算符=>右边表示一个方法,这个方法没有名字。这个方法赋予了变量lambda。

在本例中,通过Console.WriteLine(lambda("Start of string"));向lambda方法传递参数“Start of string”.经处理后会有这样的输出:

Start of string,middle part,and this was added to the string。

所以我想这样理解:Lambda表达式表示是一个函数的另一种写法。运算符=>左边是输入,右边是函数体。函数体需不需要返回值,由接收这个函数定义的lambda表达式的委托决定。

2、Lambda表达式的参数。

lambda表达式如果只有一个参数,只写出参数名就行了。下边的lambda表达式使用了参数s,因为委托类型定义了一个string类型。所以s的类型就是string。实现函数体的代码调用了String.Format()方法返回一个字符串,在调用委托是就直接把字符串输出了:

Func<string, string> oneParam = s =>
{
return String.Format("Change To UpperCase {0}", s.ToUpper());
};
Console.WriteLine( oneParam("abc"));
注:Func的用法见上一篇博文.Func<string,string>是一个系统定义的带有一个输入和一个输出的委托。

如果委托有多个参数,就要把参数放到括号中,如下:

Func<double, double, double> twoParam = (x, y) =>
{
return x * y;
};

3、单行代码和多行代码

如果Lambda表达式只有一条语句,在方法块内就不需要花括号和return语句了,编译器会自动添加一条隐式的return语句。如上边的两个表达式可以分别表示为:

Func<string, string> oneParam = s => String.Format("Change To UpperCase {0}", s.ToUpper());
Func<double, double, double> twoParam = (x, y) => x * y;

但是如果Lambda表达式实现代码需要多条语句时,就必须添加花括号和return语句了。如第一个例子的代码。

4、Lambda表达式的外部变量

Lambda表达式可以使用外部变量。但使用时应该注意些问题:

先看下边的代码:

int someVar = 5;
Func<int, int> f = x => x + someVar;
someVar = 10;
Console.WriteLine(f(5));

输出应该是x+5还是x+10呢?运行下发现输出15(x+10).即修改外部变量someVar后,会使用外部变量的新值。

对于表达式x => x + someVar; 编译器会创建一个匿名类,他有一个构造函数来传递外部变量。该构造函数取决于从外部传递过来的变量个数。对于上边这个例子,我们可以认为构造函数接受一个int,匿名类包含了一个匿名方法,其实现代码和返回类型有lambda表达式定义:

public class AnonymousClass
{
private int someVar;
public AnonymousClass(int someVar)
{
this.someVar = someVar;
}
public int AnonymousMethod(int x)
{
return x + someVar;
}
}

使用Lambda表达式时,调用该方法(AnonymousMethod(int x)),会创建匿名类的一个实例(相当于new AnonymousClass(somevar)),并传递调用该方法时的变量的值。

转:http://www.soaspx.com/dotnet/csharp/csharp_20110103_7031.html

最新文章

  1. css text-overflow:ellipsis 文字多余剪切
  2. 04OC之分类Category,协议Protocol,Copy,代码块block
  3. 在JavaScript中判断整型的N种方法
  4. 基于Html5的爱情主题网站–表白神器(第二版)
  5. 创建SQL数据库指定文件路径
  6. 使用CHttpFile从服务器端正确的读取数据
  7. WPF的ScrollViewer鼠标的滚动
  8. For Aisha(阿伊莎)
  9. android_小总结_方法过时的兼容处理
  10. int 和String之间的互转
  11. 深入分析 Java 中的中文编码问题(1)
  12. JAVA中String(字符串)课堂总结
  13. 项目Beta冲刺第二天
  14. Censys
  15. Windows下Oracle 11g创建数据库
  16. GMA Round 1 向量计算
  17. Shebang(#!)[转]
  18. node.js 初学(二)—— 搭建注册/登录服务器
  19. Typescript学习总结之模块
  20. pandas.DataFrame.to_excel

热门文章

  1. #define a int[10]与 typedef int a[10]用法
  2. 使用epublib解析epub文件(章节内容、书籍菜单)
  3. tomcat启动(三)Catalina简要分析
  4. elasticsearch插件安装之--拼音插件
  5. python 笔记-转
  6. Activiti - 设置会签
  7. Media change: please insert the disc labeled
  8. 手把手教你写一个java的orm(五)
  9. spring boot获取request
  10. Android开发之旅1:环境搭建及HelloWorld