首页 > 代码库 > VB 2015 的 闭包(Closure)
VB 2015 的 闭包(Closure)
是的,你没看错,这篇文章讲的不是 ECMAScript 。
目前 VB 14 比 C# 6 领先的功能里面,有个即将在 C# 7 实现的功能,叫做“本地方法”。这个功能与“匿名委托”的区别是:匿名委托不能直接存储到自动推断类型(在C#为var)的变量里,必须赋值给已经指定委托类型的变量,或者作为参数传递。而且匿名委托不允许声明为迭代器。
利用这个特性,可以 随便抄网上的JS/ES的代码 更方便地使用委托,但是需要注意使用闭包规避一些非预期的结果。
本地方法会像其它的Lambda表达式或匿名委托一样,捕获上下文的变量。
本地方法里面的成员不能在外部访问,因为变量重名了。
如果你不用 Dim 关键字 并且使用 Option Explicit Off,那么没有声明变量会是方法级别的变量。注意,不是全局变量。
那么,怎样把本地方法里面的变量取出呢?
这时就需要定义另一个本地方法
执行的结果是弹出一个消息框,内容是 999。
那这个写法有什么实际作用呢?
执行结果:消息框内容: 999, 消息框内容:1000
这段代码中的 f2 把 f1 中定义的 n 变量取了出来。委托 nAdd 修改了 f1 中定义的变量 n 的值。
这种写法在本地方法中有效,因为本地方法中定义的一切变量会通过名称类似于 _Closure$__2-0 这样的类包装,然后放置到它所在的普通方法的变量区进行存储。
包含本地方法的普通方法执行完毕之后,_Closure$__2-0 这样的变量包装类会脱离作用域,从而导致这个方法里面的定义的本地方法中的变量随时可以被GC回收。
警告:这些写法不要在最终发售的产品中使用,因为后期绑定会带来性能问题,而且不声明变量会让你的代码里面有一堆警告(绿色的浪线)。
留个两个思考题
第一题:消息框里面写着什么?
提示:那个绿色的浪线是VS告诉你这样写可能结果跟你想的不一样
第二题:消息框里面写着什么?
这回没提示了
VB 2015 的 闭包(Closure)