在Visual Basic (VB) 中,Lambda 表达式是一种非常方便的编写匿名函数的方式。Lambda 表达式通常用于委托和LINQ查询中,以提供轻量级的函数定义。Lambda 表达式可以看作是没有名称的函数或子程序。在 VB.NET 中,Lambda 表达式的语法大致遵循以下格式:
vb复制代码
Function(parameters) expression | |
' 或者对于子程序(没有返回值) | |
Sub(parameters) statements |
示例 1: 使用 Lambda 表达式定义委托
假设我们有一个委托类型 Delegate Sub MyDelegate(x As Integer)
,我们可以这样使用 Lambda 表达式来实例化这个委托:
vb复制代码
Dim myDelegate As MyDelegate = Sub(x) Console.WriteLine(x) | |
' 调用委托 | |
myDelegate.Invoke(10) |
示例 2: 在 LINQ 查询中使用 Lambda 表达式
在 LINQ 查询中,Lambda 表达式经常被用来指定筛选、投影、排序等操作的逻辑。以下是一个简单的示例,演示了如何在 LINQ 查询中使用 Lambda 表达式来过滤列表中的元素:
vb复制代码
Dim numbers As List(Of Integer) = New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} | |
' 使用 LINQ 和 Lambda 表达式来过滤列表 | |
Dim evenNumbers = From num In numbers Where (Function(n) n Mod 2 = 0) | |
' 输出结果 | |
For Each num In evenNumbers | |
Console.WriteLine(num) | |
Next |
注意:在上面的 LINQ 查询示例中,虽然 Where
子句后面看起来像是跟着一个 Lambda 表达式,但实际上 VB.NET 的查询语法(称为查询表达式)在此处隐藏了 Lambda 表达式的直接用法。不过,查询表达式在内部被转换为类似下面的方法调用,其中明确使用了 Lambda 表达式:
vb复制代码
Dim evenNumbers = numbers.Where(Function(n) n Mod 2 = 0) |
注意事项
- Lambda 表达式中的参数不需要指定类型(除非编译器无法推断出类型),因为 VB.NET 支持类型推断。
- Lambda 表达式可以访问其外部作用域中的变量(称为闭包),但请注意,这些变量必须是只读的,除非在 Lambda 表达式内部显式声明为
ByRef
。 - Lambda 表达式可以转换为兼容的委托类型或表达式树类型,这使其在事件处理、异步编程和LINQ查询中非常有用。