为了支持Linq平台所支持的查询特性,VB9必须引入少量“函数式编程(FP)”的特性。本次所介绍的嵌套函数和Closue特性就是最重要的一个环节。在我们探讨为什么引入这样一些特性之前,先来看看这个特性是什么样的。
VB9允许在过程内部定义函数或子程序,如:
Public Sub MyProc()Sub MyProc()
Sub Nested()Sub Nested()
'Code here
End Sub
End Sub
首先能够想到的第一个用途就是,一个帮助函数(HelperFunction)可以仅供某个过程单独使用,在这个过程外部无法访问到这个过程定义的嵌套函数。这与Delphi的嵌套函数类似。注意,嵌套函数仅可以在定义之后的上下文中访问。下面这个特性就是嵌套函数与传统函数最大的不同:
Public Sub MyProc()Sub MyProc()
Dim x As Integer
Sub Nested()Sub Nested(i As Integer)
x = i
End Sub
'Invoke subroutine
Nested(20)
Console.WriteLine(x);
End Sub
嵌套函数可以访问到外部过程中的变量,这个特性叫做Closure。有了Closure,我们就可以生成规则可变化的函数,以便实现延迟计算,这就是FP一个基本功能。VB9的内嵌函数Closure可能是通过Tuple特性来实现的,不过目前还没有关于原理的进一步细节。VB9内嵌函数相对于C#的匿名函数,主要有两个优点:
1。无需委托即可调用,可反复调用。当需要委托时,可通过AddressOf获取。
2。可直接递归。(当然,高手可以用Y算子,后话了……)
Visual Basic还考虑增加匿名内嵌函数的表达方式,就是众所周知的Lambda表达式。但是目前还没有语法放出来,我就先不介绍了。