CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

C# 3.0语言增强学习笔记(二)

Posted on 2009-04-19 17:57  Charles Chen  阅读(403)  评论(0编辑  收藏  举报

      前面复习了"隐式类型局部变量","扩展方法","对象和集合初始化器","匿名方法"知识点。见C# 3.0语言增强学习笔记(一)

这里我们另外复习C# 3.0的其他新特性:Lambda表达式

初识Lambda表达式:

使用C# 2.0中的匿名方法查找"内部包含abc子串的所有字符串": 

List.FindAll(
      
delegate(string s){
      
return s.Indexof("abc")>0}
)

 使用C# 3.0中的Lambda表达式查找"内部包含abc子串的所有字符串":

List.FindAll(s=>s.IndexOf("abc")>0)

 

Lambda表达式简介

为什么Lambda表达式比匿名方法更好?

C# 2.0的匿名方法允许我们以内联的方式来实现委托实例,而C# 3.0的Lambda表达式运行我们使用一种更接近人的思维,更自然的方式来实现类似于匿名方法同样的效果。

Lambda表达式格式

(参数列表)=>表达式或者语句块

可以有多个参数,一个参数,或者无参数。参数类型可以隐式或者显式。例如:

(x,y)=>x*//多参数,隐式类型=>表达式
x=>x*10 //单参数,隐式类型=>表达式
x=>{return x*10//单参数,隐式类型=>语句块
(int x) => x*10 //单参数,显式类型=>表达式
(int x) =>{return x*10//单参数,显示类型=>语句块
()=>{Console.WriteLine()}//无参数

注意:

1.Lambda表达式的参数类型可以省略,因为可以根据使用上下文进行推测。

2.Lambda表达式的主体(body)可以是表达式,也可以是语句块。

3.Lambda表达式传入的实参将参与类型推断,以及方法重载辨析。

4.Lambda表达式表达式和表达式体可以被转换成表达式树。

 

Lambda表达式与委托类型

Lambda表达式L可以被转换成委托类型D,需要满足以下条件:

1.L和D拥有相同的参数个数

2.L参数类型要与D参数类型相同。注意隐式类型要参与类型辨析。

3.D的返回类型与L相同,无论L是表达式,还是语句块。