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告诉你这样写可能结果跟你想的不一样

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

    这回没提示了

  • 相关阅读:
    非法字符:"ufeff"
    IntelliJ IDEA 创建Web项目
    dubbo 响应超时异常: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout.
    Spring Cacheable 注解不缓存null值
    linux 中 permission denied的问题
    unZip/Zip的安装
    @GeneratedValue 四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO
    【nginx】nginx tomcat session 共享配置
    [IDEA] IDEA 集成PlantUML
    【linux】 解决linux下vsftp 500 OOPS: cannot change directory:/home/ftp/ 办法
  • 原文地址:https://www.cnblogs.com/Nukepayload2/p/vb14_closure_localfunc.html
Copyright © 2011-2022 走看看