zoukankan      html  css  js  c++  java
  • 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告诉你这样写可能结果跟你想的不一样

    第二题:消息框里面写着什么?

    这回没提示了

  • 相关阅读:
    牛客寒假算法集训 1
    求逆序数——树状数组
    牛客网 被3整除的子序列 区间dp
    SICNU 2019 winter training #2(codeforces #531 Div3)
    iOS 给已有的类添加属性.
    coredata实践
    IOS 数据库升级
    获取当前屏幕显示的viewcontroller
    ios 自顶一个view
    mac 修改文件夹权限.
  • 原文地址:https://www.cnblogs.com/Nukepayload2/p/vb14_closure_localfunc.html
Copyright © 2011-2022 走看看