C# 9 Lambda小幅升级

2020 年 8 月 06 日

C# 9 Lambda小幅升级

C# 9 的 Lambdas 将会有一个小的升级,包含两个新特性。这两个新特性都不会改变代码的编写方式,但都体现了开发人员的意图。

Lambda 丢弃参数允许开发人员显式指定某些参数是不需要的,这样可以防止编译器对未使用的参数发出错误警告。事件处理器就可能出现这种情况,因为事件处理器有可能不需要知道发送方是谁,有不需要知道对象参数是什么。

复制代码
button1.Click += (s, e) => ShowDialog();

通过替换参数,很容易就知道变量未被使用。

复制代码
button1.Click += (_, _) => ShowDialog();

如果有必要,可以使用类型。

复制代码
var handler = (object _, EventArgs _) => ShowDialog();

静态匿名函数可作为无法捕捉本地变量(包括参数)的Lambda 或匿名函数。下面这个示例来自 最初的提议

复制代码
int y = 10;
someMethod(x => x + y); // 捕捉 'y', 导致不必要的资源分配.

在 C#中,引用本地变量的匿名函数需要分配一个临时对象。本地参数会被移出方法,并移入到对象中,在当前执行的函数结束后,它将继续存在。这是必要的,因为匿名函数存在的时间可能比创建它的函数要长。

通过添加 static 关键字来表明匿名函数阻止这种内存分配。

复制代码
int y = 10;
someMethod(static x => x + y); // 错误!

为了修复这个错误,需要将变量 y 改成常量或静态字段。

复制代码
const int y = 10;
someMethod(static x => x + y); // 好了 :-)

以下是该特性的主要规则:

  • 静态匿名函数无法从包含作用域捕获到状态。因此,局部变量、参数和包含作用域内的参数在静态匿名函数中是不可用的。
  • 静态匿名函数无法通过隐式或显式 this 或 base 引用来引用实例成员。
  • 静态匿名函数可以引用包含作用域内的静态成员。
  • 静态匿名函数可以引用包含作用域内的常量定义。
  • 在静态匿名函数中的 nameof() 可以引用包含作用域内的局部变量、参数,或者 this 或 base 函数。

原文链接

C# 9: Minor Improvements for Lambdas

2020 年 8 月 06 日 16:37 986

评论 1 条评论

发布
用户头像
现在C#还能用在哪方面呢?
2020 年 08 月 07 日 14:34
回复
没有更多评论了
  • 编程范式游记:泛型编程

    C++语言是如何通过泛型来解决C语言遇到的问题的?

    2019 年 7 月 16 日

  • PHP 5.4 弃 Register Globals 增 Traits

    PHP 5.4于本月尘埃落定,它是PHP自2009年以来的首次重大更新。该版本对语言部分进行了增强,包括支持Traits和移除部分争议特性。

  • 作用域和生存期:实现块作用域和函数

    通过实现块作用域和函数功能,来探讨作用域和生存期及其实现机制,并升级变量管理机制。

    2019 年 8 月 30 日

  • 高阶函数、委托与匿名方法

    高阶函数(higher-order function)是指把另一个函数作为参数或返回值的函数,它在JavaScript等语言中得到了广泛使用。委托一直是.NET类型中的一等公民,但是直到.NET 3.5,通过匿名方法和Lambda表达式大大简化了委托类型的创建方式之后,高阶函数才在微软官方的推动下渐渐在.NET平台上兴起。善于使用高阶函数的特性能够有效地提高开发效率,同时使代码变得优雅、高效。

  • 程序中的错误处理:错误返回码和异常捕捉

    是返回错误状态,还是用异常捕捉的方式处理错误,不仅要结合使用场景来判断,还要从程序设计的角度进行思考。

    2017 年 11 月 7 日

  • 超越 JavaScript:亚马逊发布 Lambda Layers 和 Runtime API

    AWS re:Invent 2018发布了很多新功能和服务,包括Lambda Layers,用于集中管理跨功能共享的代码和数据,以及Lambda Runtime API,将AWS Lambda从JavaScript扩展到其他编程语言。

  • Java 8 vs. Scala 之 Lambda 表达式

    2014年3月份众人期待已久的Java 8发布了,新版本从语言、编译器、类库和工具等方面对Java进行了诸多改进与提升,一时间风光无限;而JVM体系的另一门语言Scala则因为融合了函数式编程语言与面向对象编程语言的优点,从诞生以来就一直备受瞩目,迅速赢得了社区的强烈支持。两门语言孰优孰劣或许不能简单地做出定论,这取决于具体的应用场景、资源约束以及团队偏好等因素,但是无论作何选择首先都需要对它们有深入的了解,本文来自于Zappos公司Hussachai Puripunpinyo在Dzone上发表的一篇文章,介绍了他自己对Java和Scala Lambda表达式的看法。

  • 从 F#中借用函数化 API

    通用语言规范(Common Language Specification,CLS)确保任何具有一致性的.NET语言能访问被其他语言创建的函数库。这意味着命令式的语言,如VB和C#,能调用主要为F#创建的函数化函数库。实际上,许多都能直接地转换为C#代码。

  • exception:怎样才能用好异常?

    今天,我来和你好好聊聊“异常那些事”,说一说为什么要有异常,该怎么用好异常,有哪些要注意的地方。

    2020 年 5 月 26 日

  • 表达式即编译器

    动态生成代码的功能大大延伸了开发人员的表现能力。复杂的决策可以使用配制文件来表现,并交由业务分析师负责,从而避免了重复代码。过去.NET开发人员使用Relfection.Emit或CodeDom生成动态代码,不过LINQ表达式现在已经成为一种轻量级的替代品。

发现更多内容

依赖倒置

Karl

week2 学习总结

不在调上

学习笔记-第二周

薛定谔的🐴

极客大学架构师训练营

「架构师训练营」学习笔记:第 2 周

Amy

极客大学架构师训练营 作业

编程的本质

Karl

学习总结-编程本质与架构设计原则

飞雪

ARTS-WEEK2

Allen

架构师训练营作业(二)

Glowry

极客大学架构师训练营

「编程模型」C++资源引用

顿晓

c++ 智能指针 shared_ptr make_shared 资源引用

这 10 行比较字符串相等的代码给我整懵逼了,不信你也来看看

石头

性能优化 信息安全

每周 ARTS 第 33 期

落英坠露

ARTS 打卡计划

极客时间架构师训练营 - week2 - 作业2

jjn0703

极客大学架构师训练营

Flink on Zeppelin (1)入门篇

章剑锋_Jeff

大数据 flink 流计算 Zeppelin

架构师训练营-命题作业2

水边

极客大学架构师训练营

依赖倒置原则以及week2 作业

不在调上

极客大学架构师训练营

作业

飞雪

思维模型 - 组合式创新

石云升

思维模型 组合式创新 拆解组合

以“血联网”缓解“血荒” “硬科技”赋能生物安全

CECBC区块链专委会

区块链技术 智慧血站 物联网化

ARTS-week-3

youngitachi

ARTS 打卡计划 arts

架构师训练营——Week2作业

Shawn

架构师训练营第2周作业

风吹

为什么你的简历石沉大海,offer 了无音讯?

非著名程序员

程序员 程序人生 提升认知 简历优化 简历

架构师训练营第二周作业

小树林

如何更好的使用Gson

Jackey

Java Gson

认识依赖倒置原则(DIP)

王友

极客大学架构师训练营 第二周作业

架构师训练营第二周作业

一剑

ARTS-WEEK3

一周思进

ARTS 打卡计划

作为CEO你比员工厉害吗?

Neco.W

创业 创业者 CEO

一文讲透SpringMVC

知春秋

spring springmvc Servlet

面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)

一枝花算不算浪漫

jdk源码 线程池 Java 面试

极客时间架构师训练营 - week2 - 作业1

jjn0703

极客大学架构师训练营

C# 9 Lambda小幅升级-InfoQ