VB.NET Sub里面有一个函数?这是什么?

时间:2017-05-31 13:47:07

标签: vb.net visual-studio-2015

因此,当我遇到这些不圣洁的代码时,我正在阅读我的源代码,寻找改进代码的地方。

\d+

所有这一切都是使用PDFSharp读取PDF的文本部分。然而引起我注意的是第17行。这是函数中的Sub吗?

那么,这个Sub究竟在函数内部是什么?我没有写这段代码,所以我以前从未见过这样的东西。

这是如何工作的?为什么我不使用函数进行处理然后返回结果?

简而言之,我的问题是,这是什么,它是如何工作的,为什么我要用这样的东西?

1 个答案:

答案 0 :(得分:2)

这就是所谓的Lambda expression。它们用于创建内联(或更正确:in-method)方法,这使得它们比普通方法更具动态性。

在您的示例中,lambda表达式不是必需的,只会使代码更难理解。我想该代码的作者编写了一个lambda表达式而不是一个单独的方法,以便不将ReadObject暴露给任何外部代码。

lambda表达式IMO的最佳用途之一是当你想对UI线程进行线程安全调用时,例如:

If Me.InvokeRequired = True Then
    Me.Invoke(Sub() TextBox1.Text = "Process complete!")
Else
    TextBox1.Text = "Process complete!"
End If

...没有lambda的相同代码看起来像这样:

Delegate Sub UpdateStatusTextDelegate(ByVal Text As String)

...somewhere else...

If Me.InvokeRequired = True Then
    Me.Invoke(New UpdateStatusTextDelegate(AddressOf UpdateStatusText), "Process complete!")
Else
    UpdateStatusText("Process complete!")
End If

...end of somewhere else...

Private Sub UpdateStatusText(ByVal Text As String)
    TextBox1.Text = Text
End Sub

还有其他一些例子,其中lambda表达式很有用,例如,如果你想初始化一个变量但最初要做一些处理:

Public Class Globals
    Public Shared ReadOnly Value As Integer = _
        Function()
            DoSomething()
            Dim i As Double = CalculateSomething(3)
            Return Math.Floor(3.45 * i)
        End Function.Invoke()
    ...
End Class

另一个用法示例是创建部分动态的事件处理程序,如this answer of mine