BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

C#的未来:闭包注解

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 邵思华 关注 3 他的粉丝 发布于 2015年5月9日. 估计阅读时间: 4 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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

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

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

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

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

按值捕获

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

Func<int> c = [int xCopy = x]() => xCopy * 2;

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

Func<int> d = [value x]() => x * 2; //this x is a copy
Func<int> e = [val x]() => x * 2; //this x is a copy
Func<int> f = [let x]() => x * 2; //this x is a copy
Func<int> g = [=x]() => x * 2; //this x is a copy

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

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

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

Func<int> 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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

你对闭包的理解很容易误导人 by czjone czjone

这是C++ 的语法。不是c#的
应该多参数js和lua的闭包。不要为文章面文章
C++和C#的设计有很大的区别

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT