匿名方法

很多时候委托接收的方法是一次性的或者方法体是非常简单的...

例三:

我们可以写成:

有没有发现我们每次都要定义委托,很多时候签名可能是一样的。这样就没有必要定义重复的。

然后又过了很久很久...

Func和Action

可能老大也觉得我们每次定义委托有点傻,所以干脆在框架内一次定义好所有可能用到的委托。那千变万化的方法签名怎么可能定义得全?没关系,定义成泛型的不就可以了吗。

先说Func:

细心的朋友可能看到了,Func相对于AddDelegate多定义了一个int。多出了的那个是指的是返回类型。我们F12看对应的定义:

关于上面Func的写法我们可以简写成:(语法糖而已,编译后还是注释的代码

再看Action:

提醒:以后如果我们写代码的时候如果写到到delegate...,你要马上想到是否可以用Func或者Action来代替呢?C#4中的Action和Func有16个参数,足够你用了。

我们等了又等,又过了好久好久...

Lambda的诞生

我XX,这TM就是亲兄弟啊。直接去掉delegate关键字,然后加一个=>就成了lambda表达式了。(=>读作goes to

我们继续简化:

丢掉参数类型也是可以的,因为强大的VS可以根据泛型委托Func自己推断出来参数类型。

还可以简化吗?当然:

return关键字也不要了,大括号也不要了。(当然,方法体只有单条语句才能怎么做

现在看起来已经非常接近我们平时用的Lambda表达式了。

如果传入参数只有一个的话,我们还可以继续简化:

这就是我们平时见得最多的lambda长相了。

要长成这样也是有要求的:

  1. 只能有一个传入参数
  2. 方法体只能只一条语句。

关于第1点,lambda我们平时用得较多的是基于IEnumerable或IQueryable,所以只能有一个参数也就满足了。

关于第2点,我们使用扩展方法的链式编程来解决。

如:(用链式来解决第二点)

从此,我们过上了幸福的生活...

借《深入理解C#》中的一图:

Lambda表达式的演化,委托-匿名方法-Func-Lambda的更多相关文章

  1. lambda表达式不使用委托(delegate) 用FUNC

    lLambda不使用delegate关键字,而使用  Lambda运算符 => goes to l    1.Func<int,string> getInput = (int age ...

  2. 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

    引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...

  3. 泛型委托及委托中所涉及到匿名方法、Lambda表达式

    泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...

  4. 从匿名方法到 Lambda 表达式的推演过程

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. 以上是msdn官网对Lambda 表达式 ...

  5. 编写高质量代码改善C#程序的157个建议——建议150:使用匿名方法、Lambda表达式代替方法

    建议150:使用匿名方法.Lambda表达式代替方法 方法体如果过小(如小于3行),专门为此定义一个方法就会显得过于繁琐.比如: static void SampeMethod() { List< ...

  6. 通过Func 委托理解委托和匿名方法及Lambda 表达式

    Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...

  7. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  8. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

  9. 委托,匿名方法,Lambda,泛型委托,表达式树

    一.委托:完成一个委托应分三个步骤://step01:首先用delegate定义一个委托;public delegate int CalculatorAdd(int x, int y);//step0 ...

  10. C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. iOS开发UI篇—UITableviewcell的性能优化和缓存机制

    iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...

  2. iOS开发UI篇—Quartz2D简单介绍

    iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...

  3. Xcode5 运行程序 提示IOS 模拟器未能安装此应用程序

    更新了Xcode5,结果模拟器各种不配合,首先遇到的问题就是提示“IOS 模拟器未能安装此应用程序” 上网查了一下,网友给出的解决办法“删除~/Library/Application Support/ ...

  4. loadrunner (一)如何查看分析、报告结果

  5. Java 基本语法(1)

    关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词) 特点:关键字中所有字母都为小写 Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用. ...

  6. git常用命令有用

    http://www.cnblogs.com/cspku/articles/Git_cmds.html

  7. mac下XAMPP服务器配置多站点配置局域网配置 (转)

    原文:http://blog.csdn.net/wbw1985/article/details/9493989 Mac 上的软件大多是收费的,配置开源的东东也挺麻烦,网上搜索发现XAMPP软件是集成了 ...

  8. HDU 5876 (大连网赛1009)(BFS + set)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5876 题意:给定一个图(n个顶点m条边),求其补图最短路 思路:集合a表示当前还未寻找到的点,集合b表 ...

  9. 从零开始学习Node.js例子四 多页面实现数学运算 续二(client端和server端)

    1.server端 支持数学运算的服务器,服务器的返回结果用json对象表示. math-server.js //通过监听3000端口使其作为Math Wizard的后台程序 var math = r ...

  10. XPath注入笔记

    XPath注入 XQuery注入 测试语句:'or '1'='1 利用工具: Xcat介绍 Xcat是python的命令行程序利用Xpath的注入漏洞在Web应用中检索XML文档 下载地址:https ...