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)