写点什么

C#的未来:闭包注解

2015 年 5 月 08 日

在“有一定兴趣”列表上的下一条提议是相当有争议的,这条关于 Lambda 捕获列表的提议假设,它能够对闭包中的变量捕获提供更多的控制能力。

这条提议一上来就讲到了捕获列表,这是一种常见于 C++ 中的概念。以下的示例中包含了一个常见的闭包,以及一个用捕获列表所描述的闭包:

var x = 100;
Func<int> a = () => x * 2;
Func<int> b = [x] () => x * 2;

一旦使用这种语法,那么任何一个没有出现在捕获列表(由中括号 [x] 表示)中的变量都无法在匿名方法中使用,否则将会产生一个编译错误。如果你在这里使用了一个空的列表 [],那么将不会创建任何闭包。这种做法对性能来说有好处,因为不产生闭包的匿名函数将无需进行内存分配。

如果要在闭包中访问当前对象,需要通过使用 [this] 关键字,这种方式也能够减少在无意中捕获当前对象的可能性,因为这会导致内存的泄漏。

按值捕获

有些情况下,你在闭包中只需要使用某个值的拷贝,而并不想让它与原始值共享同一个变量。在这条提议中, 你可以通过以下方式使用捕获列表来表现这一行为。

Func c = int xCopy = x => xCopy * 2;

这种语法非常冗长,因此在提议中也提出了以下几种替代方式,它们的含义是完全相同的。

Func d = value x => x * 2; //this x is a copy
Func e = val x => x * 2; //this x is a copy
Func f = let x => x * 2; //this x is a copy
Func g = =x => x * 2; //this x is a copy

提议中还建议使用以下语法,让常见的按引用捕获的闭包更为明确:

Func h = ref x => x * 2; //x is an alias(别名)
Func i = &x => x * 2; //x is an alias

与之相关的一个提议是使用“细箭头”(使用单横线代替等号),它将隐式地按值捕获所有变量。

Func j = () -> x * 2; //this x is a copy

弱引用捕获

正如之前所述,由于闭包的生命周期比创建它的函数更长,因此它是一种造成内存泄漏的常见原因。因此 Miguel do Icaza 建议在这条提议中加入弱引用的使用,Stephen Toub 对此提出了以下语法:

Action k = [weak myObject] () => […]
Action l = [weak this] () => […]
Action m = [wro = new WeakReference(myObject)] () => […]

批评意见

正如在介绍中所说,这条提议是富有争议的。无论你选择了哪种变种形式,新的语法都会让代码显得相当杂乱。而且对于简短的闭包来说,语法中所包含的信息很可能你早就从代码本身看出来了。

为了支持向后兼容,捕获列表的使用必须是可选的。而由于它的语法实在是非常冗长乏味,所以大多数开发者很可能不愿意使用它,那么这个特性存在的意义就令人怀疑了。

查看英文原文: C# Futures: Closure Annotations

2015 年 5 月 08 日 02:401740
用户头像

发布了 428 篇内容, 共 150.6 次阅读, 收获喜欢 22 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营作业一:食堂就餐卡系统设计

zjzj2017

UML

架构师训练营第二周作业

Shunyi

极客大学架构师训练营

第二周架构师训练营作业

我是谁

极客大学架构师训练营

Week 2 总结

黄立

LeetCode题解:589. N叉树的前序遍历,递归,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

架构师1期-框架设计学习总结

ltl3884

极客大学架构师训练营

学习笔记:架构师训练营-第二周

四夕晖

面向对象 面向对象思想 面向对象编程

面向对象设计原则

leo

极客大学架构师训练营

架构师训练营第二周作业

四夕晖

依赖倒置原则

依赖倒置原则(DIP)

leo

极客大学架构师训练营

【架构师训练营第1期 02 周】 作业

Bear

极客大学架构师训练营

请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。

orchid9

架构师1期-框架设计作业

ltl3884

极客大学架构师训练营

第二周总结

赵孔磊

电商小游戏火爆,开发者如何快速接入?看这里

白开水

egret 淘宝电商 淘宝小程序 淘宝小游戏 电商小游戏

2020中国科技峰会系列活动青年科学家沙龙——AI学术生态与产业创新圆满召开

极客播报

人工智能 2020 中国科技峰会 青年科学家沙龙 中国科协

Bilibili资深运维工程师:DCDN在游戏应用加速中的实践

阿里云Edge Plus

运维 CDN

Week 2 作业01

Croesus

「架构师训练营」第二周课后练习

L

架構師訓練營 week2 總結

ilake

华为侯金龙:打造行业智能体,共建全场景智慧

华为云开发者社区

华为云 经济 智能

第二周作业

熊桂平

极客大学架构师训练营

训练营第二周作业 1

仲夏

训练营第二周作业 2

仲夏

【API进阶之路】太秃然了,老板要我一周内检测并导入一万个小时的视频

华为云开发者社区

视频 API

苹果A14 Bionic人工智能算力翻倍,AIOps产品落地加速引领AI生态建设逐步完善

博睿数据

人工智能 运维 APM 运维自动化 AIOPS

第二周总结

orchid9

「架构师训练营」第二周课后练习

L

硬核系列 | 深入剖析Java协程

九叔

Java 字节码插桩 协程 Coroutine

架构师训练营第二周作业

赵孔磊

用户故事信息过多或过少带来的问题

Bruce Talk

敏捷 Agile 用户故事 UserStory

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

C#的未来:闭包注解-InfoQ