您如何将其转换为 VB(使用 .NET 4.0 / VS2010)?
bw.DoWork += (o, args) =>
{
Code Here
};
我想可能是这样的:
AddHandler bw.DoWork,
Function(o, args)
Code Here
End Function
但它说 Function 不会在所有代码路径上返回值。
想法?
您如何将其转换为 VB(使用 .NET 4.0 / VS2010)?
bw.DoWork += (o, args) =>
{
Code Here
};
我想可能是这样的:
AddHandler bw.DoWork,
Function(o, args)
Code Here
End Function
但它说 Function 不会在所有代码路径上返回值。
想法?
你不能那样做,但你可以让它像这样工作:
Sub New()
AddHandler bw.DoWork, AddressOf Stuff
End Sub
Sub Stuff(ByVal o, ByVal args)
' Code Here '
End Sub
您基本上是在添加一个调用您的代码的事件,并且除了通过传递给例程的参数之外,没有任何事件返回值。这使它成为一个子而不是一个函数。
我尝试了使用 .NET 4.0 的 Sub 方式,但没有出现任何错误
AddHandler bw.DoWork,
Sub(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
'Code(Here)
End Sub
问题是我们需要知道“这里的代码”是做什么的。一个函数必须返回一个值(有一个返回语句)。如果你不想返回一个值,那么你的 Function 需要是一个 Sub。
直到 2010 年你才会得到多行 lambda。如果你必须在 VB9 中转换多行,那么你必须做一些旋转,但它可以做到。你最终不得不创建一个持有者对象,在其上设置属性,然后调用一个共享函数,这不像在 C# 中那样优雅
我在 VBNET2008 中尝试使用 lambda 表达式时遇到了类似的情况。
由于关键字 Function 用于向编译器指示使用了 lambda 表达式,因此该表达式必须返回一个值。在这种情况下,使用关键字 Sub 会更合适,但在 VBNET2008 中尚不可能。
VBNET2010 应该通过在 lambda 表达式中允许 Subs 来解决这个问题。
这是一个解决方法的示例,它对我在这个关于 SO 的问题非常有用: What would be the equivalent VB.NET code for this C#...
简而言之,您不需要将 lambda 表达式写入方法的核心,而是需要使用 AddressOf Sub 指向您希望执行工作的 Sub。
David Parvin 也确实根据您的需要编写了解决方法。
编辑:
您总是可以选择委托解决方案。私人委托子 MyMethodAsync()
Public Sub Button1_Click(...) Handles Button1.Click
Dim myMethodAsync As MyMethodAsync = AddressOf MyDoWorkAsync
_myBackgroundWorker.RunWorkerAsync(myMethodAsync)
Dim loadingForm = New LoadingForm()
loadingForm.ShowDialog()
End Sub
Private Sub _myBackgroundWorker_DoWork([parameters here...]) Handles _myBackgroundWorker.DoWork
' Do some stuff...
End Sub
我知道这不是匿名方法,因此您可能很难在 VBNET 中尝试以这种方式工作,即使是 2008 年也是如此。这些功能应该是 VBNET2010 的一部分,但我认为他们删掉了,但我实在不敢肯定地确认。
希望这可以帮助!