我正在使用VB.Net 4并成功使用具有以下签名的类:
子寄存器(Of TMessage)(作为对象的收件人,操作为 System.Action(Of TMessage))
我想在VB中学习lambdas,所以我想看看我是否可以简化当前的代码。
当前:我在类的构造函数中有以下内容(为简洁起见而简化)
Public Sub New()
Dim myAction As New Action(Of String)(AddressOf HandleMessage)
Messenger.Default.Register(Of [String])(Me, myAction)
End Sub
后来在课堂上我有以下内容:
Private Function HandleMessage(sMsg As String)
If sMsg = "String Value" Then
If Me._Selection.HasChanges Or Me._Selection.HasErrors Then
Return True
End If
Return False
Else
Return False
End If
End Function
问题:有没有办法将它简化为像C#中的lambda,我不必在构造函数中声明MyAction变量,只需将字符串值传递给HandleMessage函数“ inline “与寄存器子? (我希望这是有道理的)
答案 0 :(得分:3)
所以你的构造函数代码相当于:
Messenger.[Default].Register(Of String)(Me,
Function(sMsg)
If sMsg = "String Value" Then
If Me._Selection.HasChanges Or Me._Selection.HasErrors Then
Return True
End If
Return False
Else
Return False
End If
End Function)
值得一提的是,虽然你不需要使用lambdas来摆脱你的显式委托创建。这也是完全合法的:
Messenger.[Default].Register(Of String)(Me, AddressOf HandleMessage)
虽然您的示例有一些奇怪之处:您已将Register方法声明为采用Action(Of TMessage)
,这意味着传递的函数不需要返回值。但是,您的函数返回Boolean
。这里的Visual Basic正在进行花哨的“委托放松”并且丢掉了返回值。因此,所有Return True
/ Return False
位实际上并没有做任何特殊的事情。