Lamda表达式的参数捕获,太酷了
lamda表达式有了参数捕获这个功能,让Action这个委托变得无所不能。Action委托就是无参数,无返回值的一个代理类型。
它只能对应于下面这种类型的函数声明。
public void Function()
{
//Do something
}
public void Function2()
{
//Do something
}
public void Function3()
{
//Do something
}
假设我们定义一个共通的执行函数
public void Execute(Action action)
{
try
{
action.Invoke();
}
catch (Exception ex)
{
//Log
Debug.WriteLine(ex);
}
finally
{
}
}
那么,调用上面的三个函数,就是这个样子。
Execute(Function);
Execute(Function2);
Execute(Function3);
这么做的好处是,可以将一些共通的处理,例如异常捕获等放到Execute函数里,而其他的被调用函数不用写这部分代码。
但是这样会引申出一个问题,我们的函数不可能都是些无返回值,无参数的函数,例如:
public bool Edit(Account account)
{
bool result = false;
//Todo
result = true;
return result;
}
那么上面的Excute函数就不适用了,难道我们又要定义一个类似于下面这样的委托吗?
public delegate bool EditDelegate(Account accout);
在项目中往往有很多的函数原型,如何一一这样声明,早就累死了。能不能有一种共通的方式来统一处理所有的函数呢?
Lamda的参数捕获出场了。看看下面这段代码:
Account account = new Account();
AccountService accountService = new AccountService();
bool result = false;
Execute(() => { result = accountService.Edit(account); });
我们依然共用了我们先前定义的Exeute函数,但却调用一个有参数,有返回值的函数。这要全归功于Lamda表达式,主要有以下两点:
1,()=>{} 这句Lamda表达式代表了一个无参数,无返回值的委托,也就是和Action委托签名一致,Execute函数也就能调用。
2,这一点最关键,result和account是在Lamda表达式外部定义的变量,被Lamda表达式捕获,作为参数传递和返回值使用。并且,Lamda表达式和外部变量是同步的,也就是Lamda的返回值会改变result的值。这一点当时我也没有想明白,按理说result是bool型,是一个值类型,应该是按值传递的,结果不会被改变。但是Lamda表达式对于所有捕获的外部变量,都是按引用传递的,这一点要谨记!也正是有了这个特点,让我们可以在Lamda表达式的内部利用参数捕获的这个特性来调用任意的函数。而Lamda本身只要和Action委托一致就行了。
我只能说,这个功能真是太酷了。如果你用的好,就可以大大的简化编程。
Lamda表达式的参数捕获,太酷了的更多相关文章
- Lambda表达式的参数捕获
以常用的Action委托为例: 有如下3个无参数的方法: public void Function() { //Do something } public void Function2() { //D ...
- [.net 面向对象程序设计进阶] (5) Lamda表达式(一) 创建委托
[.net 面向对象程序设计进阶] (5) Lamda表达式(一) 创建委托 本节导读: 通过学习Lambda表达式,学会创建委托和表达式目录树,深入了解Lambda的特性,让你的代码变的更加清晰. ...
- Lamda表达式
Lamda表达式 函数式编程的产生(匿名内部类) interface Mes{ public void speak(); } public class Lam { public static void ...
- 让操作javascript对象数组像.net lamda表达式一样
让操作javascript对象数组像.net lamda表达式一样 随着web应用程序的富客户端化.ajax的广泛使用及复杂的前端业务逻辑.对js对象数组.json数组的各种操作越来越多.越来越复杂. ...
- lamda 表达式
Lamda 表达式 高阶语言中的lamda表达式, 灵感来自于lamda演算.lamda演算包括一条变换规则 (变量替换) 和一条函数定义方式, 通过带入和替换, 对输入产生输出. Connect 新 ...
- 解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现
前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将 ...
- [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门
[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...
- [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是 ...
- python 内置函数 lamda表达式。 open 文件方法
lamda 表达式 lambda表达式 学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 普通的条件语句 if 1 == 1: name = 'kaixin' else: ...
随机推荐
- HttpWebRequest、HttpWebResponse、HttpClient、WebClient等http网络访问类的使用示例汇总
工作中长期需要用到通过HTTP调用API以及文件上传下载,积累了不少经验,现在将各种不同方式进行一个汇总. 首先是HttpWebRequest: /// <summary> /// 向服务 ...
- Android Activity标签属性
Android Activity标签属性 Activity 是 Android 系统四大应用组件之一,用户可与 Activity 提供的屏幕进行交互,以执行拨打电话.拍摄照片.发送电子邮件等操作开发者 ...
- Go 源码学习之--net/http
其实自己不是很会看源码,但是学习优秀的源码是提升自己代码能力的一种方式,也可以对自己以后写代码有一个很好的影响,所以决定在之后的时间内,要有一个很好的习惯,阅读优秀的源码.刚开始自己会觉得看源码很痛苦 ...
- Boost家族
大师Yoav Freund在文章<A decision-theoretic generalization of on-line leanring and an application to bo ...
- Android各版本代号、版本号、API/NDK级别、发布时间及市场份额
Android各版本代号.版本号.API/NDK级别.发布时间及市场份额 代号 版本号 API/NDK级别 发布时间 - O 8.0 API level 26 2017-3-21 牛轧糖 Nougat ...
- 36氪首发 | 「myShape」完成千万级人民币 Pre-A轮融资,推出 AI 智能健身私教
无需任何可穿戴设备. 36氪获悉,myShape(原Shapejoy)已于近期完成千万级人民币的Pre-A轮融资,由天奇阿米巴领投,远洋集团.七熹资本以及老股东跟投.过去 myShape 曾获得元迅资 ...
- [AWS vs Azure] 云计算里AWS和Azure的探究(5) ——EC2和Azure VM磁盘性能分析
云计算里AWS和Azure的探究(5) ——EC2和Azure VM磁盘性能分析 在虚拟机创建完成之后,CPU和内存的配置等等基本上是一目了然的.如果不考虑显卡性能,一台机器最重要的性能瓶颈就是硬盘. ...
- ny525 一道水题
一道水题时间限制:1000 ms | 内存限制:65535 KB 难度:2描述 今天LZQ在玩一种小游戏,但是这游戏数有一点点的大,他一个人玩的累,想多拉一些人进来帮帮他,你能写一个程序帮帮他吗? ...
- animate.css源码
/*! 动画属性: animation-name:动画名称 animation-duration:动画时间 animation-timing-function:动画的速度曲线 animation-de ...
- js弹出层的插件
1.jquery.fancybox.pack.js 2.artdialog 3.