前面复习了"隐式类型局部变量","扩展方法","对象和集合初始化器","匿名方法"知识点。见C# 3.0语言增强学习笔记(一)
这里我们另外复习C# 3.0的其他新特性:Lambda表达式
初识Lambda表达式:
使用C# 2.0中的匿名方法查找"内部包含abc子串的所有字符串":
List.FindAll(
delegate(string s){
return s.Indexof("abc")>0}
)
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*y //多参数,隐式类型=>表达式
x=>x*10 //单参数,隐式类型=>表达式
x=>{return x*10} //单参数,隐式类型=>语句块
(int x) => x*10 //单参数,显式类型=>表达式
(int x) =>{return x*10} //单参数,显示类型=>语句块
()=>{Console.WriteLine()}//无参数
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是表达式,还是语句块。