是的,你没看错,这篇文章讲的不是 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. Android手机的 storage

    老外的一段解释 -------------------------------------------------------------------------------------------- ...

  2. mysql 分表策略

    mysql单表数据量巨大时,查询性能会很差,经常遇到的是存储日志相关的数据会每天产生大量的数据. 这里提供单表拆分成多表存储的三个思路: 一,固定N张表,ID取模存储 预先创建好N张表,记录按ID取模 ...

  3. 使用magick.net将pdf转换为图片

    现在手上有个需求是要将pdf转换为一页一页的image.最开始找到的是pdfbox来处理pdf的.在pdfbox.apache.org的官网首页写了一句'convert you pdfs to ima ...

  4. OceanBase server处理网络包的回调逻辑

    OceanBase处理网络包的逻辑还是蛮绕的,这里以UPS为例,作为给自己的备忘. UPS代码的main.cpp中调用ObUpdateServerMain的start启动server.start函数会 ...

  5. Visual Studio 2015 开发大量 JavaScript 代码项目程序崩溃的解决方案

    最近公司做新项目,基于 Bootstrap.AngularJS 和 kendo 开发一套后台的管理系统,在项目中使用了大量的 JavaScript 文件,这两天 Visual Studio 2015 ...

  6. java之对象转型2

    public class TestCasting2{ public static void main(String args[]){ TestCasting2 test2= new TestCasti ...

  7. 读书笔记_Effective_C++_条款四十二:了解typename的双重意义

    顾名思义,typename有双重含意.只要你用过template,那么第一重含意一定知道,那就是声明模板的时候,我们既可以这样写: template <class T> 也可以这样写 te ...

  8. Node快速安装

    1.安装nvm  nvm是一个快速安装和切换nodejs版本的管理器 直接从 github clone nvm 到本地, 这里假设大家都使用 ~/git 目录存放 git 项目: $ cd ~/git ...

  9. 让我们一起Go(十一)

    前言: 今天又要继续了,当初自己的挖的坑必须得填啊,尽管天气非常滴热,但是丝毫无法阻挡我填坑的热情,那么,我们继续让我们一起Go!!! 定义方法: 这里我们要来看看Golang中的(Methods)方 ...

  10. 关于同一台机器上安装多个sql实例的连接方法

    由于客户需要在一台服务器上安装了两个sql服务器(一个sql2000,一个是sql2005,其实例名不同),默认的端口1433被先安装的sql2000使用,后来安装的的随机启用了一个3045端口.其中 ...