VB.NET简化动作(T)

时间:2013-01-25 06:09:48

标签: vb.net lambda refactoring

我正在使用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 “与寄存器子? (我希望这是有道理的)

1 个答案:

答案 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位实际上并没有做任何特殊的事情。