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

第十七,十八,十九天
(广州终于冷了……)
(做了两天的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值