是的,你没看错,这篇文章讲的不是 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)的更多相关文章

  1. JavaScript闭包(Closure)

    JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...

  2. 聊一下JS中的作用域scope和闭包closure

    聊一下JS中的作用域scope和闭包closure scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久 ...

  3. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)

    1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...

  4. 深入理解JavaScript闭包(closure)

    最近在网上查阅了不少javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...

  5. [转] Java内部类之闭包(closure)与回调(callback)

    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥 ...

  6. JavaScript 进阶(四)解密闭包closure

    闭包(closure)是什么东西 我面试前端基本都会问一个问题"请描述一下闭包".相当多的应聘者的反应都是断断续续的词,“子函数”“父函数”“变量”,支支吾吾的说不清楚.我提示说如 ...

  7. [转载]学习Javascript闭包(Closure)

    学习Javascript闭包(Closure)     源地址: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures ...

  8. Swift语言精要-闭包(Closure)

    闭包(Closure)这个概念如果没学过Swift的人应该也不会陌生. 学过Javascript的朋友应该知道,在Javascript中我们经常会讨论闭包,很多前端工程师的面试题也会问到什么是闭包. ...

  9. 【Python】闭包Closure

    原来这就是闭包啊... 还是上次面试,被问只不知掉js里面的闭包 闭包,没听过啊...什么是闭包 回来查了下,原来这货叫闭包啊...... —————————————————————————————— ...

随机推荐

  1. LCLFramework框架之Repository模式

    Respository模式在示例中的实际目的小结一下 Repository模式是架构模式,在设计架构时,才有参考价值: Repository模式主要是封装数据查询和存储逻辑: Repository模式 ...

  2. js实现表单序列化的两种方法。

    function serialize(form) { var parts = [], elems = form.elements, i = , len = elems.length, filed = ...

  3. IPFS搭建分布式文件系统 - 访问控制

    IPFS 一个内容可寻址.对等的超媒体分发协议. IPFS网络中的节点形成分布式文件系统. 为什么要用IPFS? “IPFS and the Blockchain are a perfect matc ...

  4. Etl之HiveSql调优(设置map reduce 的数量)

    前言: 最近发现hivesql的执行速度特别慢,前面我们已经说明了left和union的优化,下面咱们分析一下增加或者减少reduce的数量来提升hsql的速度. 参考:http://www.cnbl ...

  5. 动态密码卡TOTP算法

    TOTP NET实现:http://googleauthcsharp.codeplex.com/ 引用:http://www.cnblogs.com/wangxin201492/p/5030943.h ...

  6. Apk去签名校验详解

    某些apk为了防止重打包,使用了签名校验.所以在破解的时候我们需要破解签名校验.在定位签名校验位置时常用的关键词有sign,signature,checkSign,signCheck,getPacka ...

  7. 安卓序列化漏洞 —— CVE-2015-3525

    在2014年,Jann Horn发现一个安卓的提权漏洞,该漏洞允许恶意应用从普通应用权限提权到system用户执行命令,漏洞信息与POC见(1].漏洞的成因源于在安卓系统(<5.0)中,java ...

  8. [转]VS2005/2008过期之后简单实用的升级方法

    网络上有不少key,但是用了之后没效果,发现了一个好方法可以解决.  把\vs\setup\下面的 setup.sdb文件用文本编辑器打开,然后改动其最后的一行([Product Key] 下面的一行 ...

  9. MyBatis知多少(10)应用程序数据库

    应用程序数据库往往是最小.最简单.也最易于使用的数据库.这种数据库往往是我们这些开发人员通常不介意使用甚至非常乐意使用的.应用程序数据库通常与我们的应用程序处于同一个项目中,两者一齐设计和实现.正是因 ...

  10. Sqoop实现关系型数据库到hive的数据传输

    Sqoop实现关系型数据库到hive的数据传输 sh脚本 #!/bin/sh v_columns=NOTE_ID_1,NOTE_NAME_1,NOTE_ID_2,NOTE_NAME_2,NOTE_ID ...