2

私はVB.Net4を使用しており、次の署名を持つクラスを正常に使用しています。

Sub Register(Of TMessage)(recipient As Object、action As System.Action(Of TMessage))

VBのラムダについて学びたいので、現在のコードを単純化できるかどうかを確認したいと思いました。

現在:クラスのコンストラクターに次のものがあります(わかりやすくするために簡略化されています)

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#のようにラムダに単純化する方法はありますか?コンストラクターでMyAction変数を宣言する必要はありませんが、文字列値をレジスタサブでHandleMessage関数 " inline "に渡すだけですか?(私はそれが理にかなっていることを願っています)

4

1 に答える 1

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)

明示的なデリゲートの作成を取り除くためだけにラムダを使用する必要はありませんが、言及する価値があります。これも完全に合法です。

Messenger.[Default].Register(Of String)(Me, AddressOf HandleMessage)

ただし、例では少し奇妙な点があります。Registerメソッドを、Action(Of TMessage)渡された関数が戻り値を必要としないことを意味するとして宣言しました。ただし、関数はを返しますBoolean。ここでのVisualBasicは、派手な「リラクゼーションの委任」を行っており、戻り値を破棄しています。したがって、すべてのReturn True/Return Falseビットは実際には特別なことをしていません。

于 2013-01-25T07:01:40.263 に答える