因此,当我遇到这些不圣洁的代码时,我正在阅读我的源代码,寻找改进代码的地方。
\d+
所有这一切都是使用PDFSharp读取PDF的文本部分。然而引起我注意的是第17行。这是函数中的Sub吗?
那么,这个Sub究竟在函数内部是什么?我没有写这段代码,所以我以前从未见过这样的东西。
这是如何工作的?为什么我不使用函数进行处理然后返回结果?
简而言之,我的问题是,这是什么,它是如何工作的,为什么我要用这样的东西?
答案 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。