VB.NET简化操作(对T)

VB.NET简化操作(对T),vb.net,lambda,refactoring,Vb.net,Lambda,Refactoring,我正在使用VB.Net 4,并且成功地使用了具有以下签名的类: (TMessage的)子寄存器(接收者作为对象,动作作为对象) 系统动作(指TMessage)) 我想学习VB中的lambdas,所以我想看看是否可以简化我当前的代码 目前:我在一个类的构造函数中有以下内容(为了清晰起见,进行了简化) 在接下来的课程中,我有以下内容: Private Function HandleMessage(sMsg As String) If sMsg = "String Value" Then

我正在使用VB.Net 4,并且成功地使用了具有以下签名的类:

(TMessage的)子寄存器(接收者作为对象,动作作为对象) 系统动作(指TMessage))

我想学习VB中的lambdas,所以我想看看是否可以简化我当前的代码

目前:我在一个类的构造函数中有以下内容(为了清晰起见,进行了简化)

在接下来的课程中,我有以下内容:

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,在C#中,我不必在构造函数中声明MyAction变量,只需将字符串值传递给带有register sub的HandleMessage函数“inline?(我希望这是有意义的)

因此您的构造函数代码相当于:

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方法采取了
操作(对于TMessage)
,这意味着传递的函数不需要返回值。但是,您的函数返回一个
布尔值。这里的VisualBasic正在进行奇特的“委托松弛”,并放弃了返回值。所以你所有的
返回True
/
返回False
位实际上并没有做什么特别的事情。

伙计,我有点忘了vb.net的东西有多笨拙。你写了c#并试着通过c#到vb转换器运行它吗?Dan-o是的,但是转换器从来没有正确处理c lambdas,有时它太离谱了。是的,谢谢,我尝试了太多的东西,我忘记了函数vs子变化。你的代码成功了。我以为我试过了,但我想我没有。
Messenger.[Default].Register(Of String)(Me, AddressOf HandleMessage)