lambda 过程

在生成PDF文档过程中,经常会重复使用某一段代码,以前需要通过全局代码或自定义函数实现代码的复用。

如果这段代码仅在某个事件代码中反复使用,不需要在其他事件中使用,那么使用lambda过程可能更方便。

定义lambda过程的时候((包括Sub或Function)),不需要指定过程名,也不需要用As指定返回类型,直接将Function或Sub赋值给一个变量 即可。

lambda过程可以直接在事件代码中定义,不需要在全局代码中定义,更便于维护和使用,

示例一

你可以直接复制下面的代码到命令窗口测试执行:

'定义一个lambda ,赋值给变量getSortColumn
Dim
getSortColumn =
Function
(tIndex As Integer)
   
Select Case tIndex
       
Case 0
           
Return "FirstName"
       
Case 1
           
Return "LastName"
       
Case 2
           
Return "CompanyName"
       
Case Else
           
Return "LastName"
   
End Select
End
Function 'lambda过程定义完成

Dim sc1 As String = getSortColumn.Invoke(0) '通过变量的Invoke调用lambda过程
Dim
sc2 As String = getSortColumn.Invoke(3)
MessageBox.Show(sc1)

MessageBox.Show(sc2)

需要注意的是:

1、定义lambda过程的语句后面不能有任何内容,注释也不行,所以下面的代码会出错:

Dim getSortColumn =  '这里不能有注释
Function
(tIndex As Integer) '这里也不能有注释
    'lambda过程 代码
End Function

2、变量和过程代码必须分成两行,也就是"="号之后要换行,如果写成一行:

Dim getSortColumn = Function(tIndex As Integer)
   
'lambda过程 代码
End Function

虽然编译运行都不会出错,但会影响代码编辑器的重排功能,切记切记。

示例二

如果不需要返回值,则在定义lambda过程的时候,用Sub代替Funtion,例如:

Dim ShowSum =
Sub
(tv1 As Double, tv2 As Double, tv3 As Double)
   
Dim tsum As Double
    tsum = tv1 + tv2 + tv3
    MessageBox.Show(
"合计:" & tsum)
End
Sub

ShowSum.Invoke(1, 2, 3)

示例三

如果lambda过程只有一行代码,则可以简写为一行:

Dim ShowMsg = Function(tmsg) Messagebox.Show(tmsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)

ShowMsg.Invoke(
"今天星期五啦")

上面的代码等效于:

Dim ShowMsg =
Function
(tmsg)
    Messagebox.Show(tmsg,
"提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
End
Function

ShowMsg.Invoke(
"今天星期五啦")

lambda过程的变量名与参数名

你可能已经留意到了,前面的示例代码中,lambda过程的变量名和参数名,我都加了一个前缀t,例如tsum。

这是因为lambda过程的变量名和参数名,不能和主代码中的变量同名,所以加上一个前缀以示区分,当然前缀你可以自己规定。

例如下面的代码是没有办法通过编译的,因为主代码和lambda过程存在同名变量v1、v2、v3和sum:

Dim mySum =
Function
(v1 As Double, v2 As Double, v3 As Double)
   
Dim sum As Double
    sum = v1 + v2 + v3
  
Return sum
End
Function
Dim
v1 As Integer = 100
Dim
v2 As Integer = 200
Dim
v3 As Integer = 100
Dim
sum As Integer = mySum .Invoke(v1, v2, v3)

lambda过程使用主代码中的变量

lambda过程可以使用主代码中的变量,但这个变量必须在定义lambda过程之前定义,否则会出错,例如:

Dim first As Double = 100
Dim
mySum =
Function
(tv1 As Double, tv2 As Double, tv3 As Double)
   
Dim tsum As Double
    tsum = tv1 + tv2 + tv3
    tsum = tsum + first 
'first变量在lambda过程之前定义,可以调用
    tsum = tsum + second
'错误,second变量在lambda过程之后定义,不能调用
   
Return tsum
End
Function
Dim
second As Double = 200
Dim
sum As Integer = mySum.Invoke(100, 200, 300)
MessageBox.Show(sum)


本页地址:http://www.foxtable.com/webhelp/topics/6060.htm