《C#高级教程》学习笔记12

来源:互联网 发布:乐视电视怎么样 知乎 编辑:程序博客网 时间:2024/05/16 06:22
第十七,十八,十九天
(广州终于冷了……)
(做了两天的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()));
}
0 0
原创粉丝点击