第十七,十八,十九天
(广州终于冷了……)
(做了两天的JAVA实验题,C#有点坠落了)
8.3 Lambda表达式
自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:Lambda委托。只要有委托参数类型的地方,就可以使用Lambda表达式。
前面使用匿名方法的例子改为Lambda表达式:
using System;
namespace W{
class Program{
static void Main(){
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"));
}
}
}
8.3.1参数
如果只有一个参数,只写出参数名就足够。
如果委托使用多个参数,就把参数名放在花括号中。
为了方便,可以在花括号中给变量名添加参数类型。如果编译器不能匹配重载后的版本,即么使用参数类型可以帮助找到匹配的委托。
8.3.2 多行代码
如果lambda表达式只有一条语句,在方法块内就不需要花括号和return语句,因为编译器会添加一条隐式的return语句。
Func(double,double) square=x=>x*x;
添加花括号,return语句和分号是完全合法的,通常比不添加这些符号更容易阅读:
Func<double,double>square=x=>{
return x*x;
}
但是如果在Lambda表达式的实现代码中需要多条语句,就必须添加花括号和return语句。
8.3.3闭包
通过Lambda表达式可以访问Lambda表达式块外部的变量,这称为闭包
8.3.4使用foreach语句的闭包
var values=new List<int>(){10,20,30};
var funcs=new List<Func<int>>();
foreach(var val in values){
funcs.Add(()=>val);
}
foreach(var f in funcs){
Console.WriteLine((f()));
}
上面代码在C#5.0是10、20、30
而在代码在C#4.0是三次30
原因是foreach会创建while循环,而那个循环变量是在外面的
所以4.0成功的版本:
var values=new List<int>(){10,20,30};
var funcs=new List<Func<int>>();
foreach(var val in values){
var v=val;
funcs.Add(()=>v);
}
foreach(var f in funcs){
Console.WriteLine((f()));
}
(广州终于冷了……)
(做了两天的JAVA实验题,C#有点坠落了)
8.3 Lambda表达式
自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:Lambda委托。只要有委托参数类型的地方,就可以使用Lambda表达式。
前面使用匿名方法的例子改为Lambda表达式:
using System;
namespace W{
class Program{
static void Main(){
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"));
}
}
}
8.3.1参数
如果只有一个参数,只写出参数名就足够。
如果委托使用多个参数,就把参数名放在花括号中。
为了方便,可以在花括号中给变量名添加参数类型。如果编译器不能匹配重载后的版本,即么使用参数类型可以帮助找到匹配的委托。
8.3.2 多行代码
如果lambda表达式只有一条语句,在方法块内就不需要花括号和return语句,因为编译器会添加一条隐式的return语句。
Func(double,double) square=x=>x*x;
添加花括号,return语句和分号是完全合法的,通常比不添加这些符号更容易阅读:
Func<double,double>square=x=>{
return x*x;
}
但是如果在Lambda表达式的实现代码中需要多条语句,就必须添加花括号和return语句。
8.3.3闭包
通过Lambda表达式可以访问Lambda表达式块外部的变量,这称为闭包
8.3.4使用foreach语句的闭包
var values=new List<int>(){10,20,30};
var funcs=new List<Func<int>>();
foreach(var val in values){
funcs.Add(()=>val);
}
foreach(var f in funcs){
Console.WriteLine((f()));
}
上面代码在C#5.0是10、20、30
而在代码在C#4.0是三次30
原因是foreach会创建while循环,而那个循环变量是在外面的
所以4.0成功的版本:
var values=new List<int>(){10,20,30};
var funcs=new List<Func<int>>();
foreach(var val in values){
var v=val;
funcs.Add(()=>v);
}
foreach(var f in funcs){
Console.WriteLine((f()));
}