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: ...
随机推荐
- [转]PostgreSQL 逻辑结构 和 权限体系 介绍
摘要: 本文旨在帮助用户理解PostgreSQL的逻辑结构和权限体系,帮助用户快速的理解和管理数据库的权限. 逻辑结构 最上层是实例,实例中允许创建多个数据库,每个数据库中可以创建多个schema,每 ...
- JavaScript 如何从引用类型(Array 、 Object)创建一个新的对象
数组的增删改 1.新增一项可以使用concat方法,它不会对原有数组进行改动,而是创建一个新数组 let a = [0, 1, 2] let b = a.concat([3]) console.log ...
- java学习记录--ThreadLocal使用案例
本文借由并发环境下使用线程不安全的SimpleDateFormat优化案例,帮助大家理解ThreadLocal. 最近整理公司项目,发现不少写的比较糟糕的地方,比如下面这个: public class ...
- FIR特性及仿真实现_01
作者:桂. 时间:2018-02-05 19:01:21 链接:http://www.cnblogs.com/xingshansi/p/8419007.html 前言 本文主要记录FIR(finit ...
- grafana + influxdb + telegraf
grafana + influxdb + telegraf , 构建性能监控平台http://www.cnblogs.com/Scissors/p/5977670.html https://docs. ...
- Nginx(四):压缩功能详解
gzip (GNU-ZIP) 是一种压缩技术.经过 gzip 压缩后页面大小可以变为原来的 30%甚至更小. 这样,用户浏览页面的时候速度会快得多. gzip 的压缩页面需要浏览器和服务器双方都支持 ...
- [Leet Code]Path Sum II
此题如果 #1 和 #4 判断分支交换,大集合就会超时(因为每次对于非叶子节点都要判断是不是叶子节点).可见,有时候if else判断语句也会对于运行时间有较大的影响. import java.uti ...
- Java之JDBC①
JDBC工具准备:Mysql(数据库). MyEclipse(开发工具).Navicat(数据库管理工具) JDBC编程步骤·加载驱动程序:class.forName(driverClass); ...
- HTML杂记
1.URL uniform resource locator 遵循格式: scheme://host.domain:port/path/filename scheme - 定义因特网服务的类型.最常 ...
- markModified声明要修改的数组字段
更新一个文档的字段的时候,如果该字段的类型是数组类型,则必须在更新保存前声明一下这个数组字段要被修改,否则这个数组字段的值不会被修改.如 article.markModified('categorys ...