• Lambda表达式的演化,委托-匿名方法-Func-Lambda


     匿名方法

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

    例三:

    我们可以写成:

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

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

    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#》中的一图:

  • 相关阅读:
    通过运用CSS框架学到了什么
    浏览器判断一览表
    默认样式表之HTML4
    MooTools 1.4 源码分析 -overloadSetter
    MooTools 1.4 源码分析
    MooTools 1.4 源码分析
    javascript一些底层方法总结及用法
    viewport移动端适配,读文笔记
    vue获取v-model数据类型boolean改变成string
    contextify::ContextifyScript::New(const v8::FunctionCallbackInfo<v8::Value>&):
  • 原文地址:https://www.cnblogs.com/toloe/p/5805421.html
Copyright © 2020-2023  润新知