博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#的未来:闭包注解
阅读量:6254 次
发布时间:2019-06-22

本文共 1745 字,大约阅读时间需要 5 分钟。

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

\\

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

\\

var x = 100;\\

Func\u0026lt;int\u0026gt; a = () =\u0026gt; x * 2;\\
Func\u0026lt;int\u0026gt; b = [x] () =\u0026gt; x * 2;

\\

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

\\

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

\\

按值捕获

\\

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

\\

Func\u0026lt;int\u0026gt; c = [int xCopy = x]() =\u0026gt; xCopy * 2;

\\

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

\\

Func\u0026lt;int\u0026gt; d = [value x]() =\u0026gt; x * 2; //this x is a copy\

Func\u0026lt;int\u0026gt; e = [val x]() =\u0026gt; x * 2; //this x is a copy\\
Func\u0026lt;int\u0026gt; f = [let x]() =\u0026gt; x * 2; //this x is a copy\\
Func\u0026lt;int\u0026gt; g = [=x]() =\u0026gt; x * 2; //this x is a copy

\\

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

\\

Func\u0026lt;int\u0026gt; h = [ref x]() =\u0026gt; x * 2; //x is an alias(别名)\

Func\u0026lt;int\u0026gt; i = [\u0026amp;x]() =\u0026gt; x * 2; //x is an alias

\\

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

\\

Func\u0026lt;int\u0026gt; j = () -\u0026gt; x * 2; //this x is a copy

\\

弱引用捕获

\\

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

\\

Action k = [weak myObject] () =\u0026gt; […]\

Action l = [weak this] () =\u0026gt; […]\\
Action m = [wro = new WeakReference(myObject)] () =\u0026gt; […]

\\

批评意见

\\

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

\\

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

\\

查看英文原文:

转载地址:http://fyfsa.baihongyu.com/

你可能感兴趣的文章
微软能否撑起Silverlight的明天?
查看>>
遍历文件夹
查看>>
js和html标签的混合使用
查看>>
生成不重复随机数
查看>>
Kinect for Windows SDK 1.5 的改进及新特性
查看>>
jQuery-倒计时
查看>>
expect语法基础: while、for 循环、if 语句的用法示例
查看>>
ubuntu 9.04 的 NTFS 分区自动加载
查看>>
现代软件工程讲义 7 设计阶段 Spec
查看>>
精确控制MFC控件窗口的位置和大小(top|left|width|height)
查看>>
ASP.NET MVC中Areas的namespaces和UseNamespaceFallback
查看>>
队列希望IOS开发(66)之构建自己的分派队列
查看>>
谈谈Android中的SurfaceTexture
查看>>
Nginx+Varnish又开始新的征程了
查看>>
NUnit-Console 命令行选项详解
查看>>
[问题2014S10] 解答
查看>>
微信游戏《全民炫舞》公司的引擎开发和布料系统技术介绍
查看>>
同步与互斥的区别和联系
查看>>
eclipse中tomcat能正常启动,在浏览器中不能打开问题
查看>>
基于Linux根据僵尸网络病毒平台《比尔盖茨》
查看>>