How to declare lambda event handlers in VB.Net?

前端 未结 4 1304
盖世英雄少女心
盖世英雄少女心 2021-02-07 02:44

I believe the following VB.Net code is the equivalent of the proceeding C# code; however the VB.Net test fails - the event handling Lambda is never called.

What is going

相关标签:
4条回答
  • 2021-02-07 03:02

    WPF controls that have popups require an instance of the WPF Application Object. In a WPF application, this is automatically created. This is not the case in a WinForm application. For this reason, this object must be created manually. The Application also must be set to remain open until it is shut down through code, otherwise it will shut automatically when the WinForm applications determines it is no longer needed. The following code will open the Application object in a WinForm and keep it open until it is closed. Shutting down the Application object when the WinForm closes is the recommended approach.

      Dim app As System.Windows.Application = New System.Windows.Application With {
                .ShutdownMode = Windows.ShutdownMode.OnExplicitShutdown
            }
            AddHandler Closed, Sub()
                                   app.Shutdown()
                               End Sub
    
    0 讨论(0)
  • 2021-02-07 03:16

    For those finding this question now: since Visual Basic 2010 (VB 10.0), anonymous Subs do work, so you can write something like:

    Sub() eventRaised = True
    
    0 讨论(0)
  • 2021-02-07 03:24

    Long story short, you cannot do that in VB for the time being (it is on the list of features considered for next release). You have to use a declared method and the AddressOf operator.

    The VB team did not have the time to include anonymous delegates in the language (which is what you are trying to use, technically not a lambda expression).

    Lambda expressions they had to implement so that Linq can actually work. Anonymous delegates are not required by anything (but would be quite useful). I guess they spent more time on wrapping up things like Linq To XML and XML litterals and integrating more query operators in the syntax...

    0 讨论(0)
  • 2021-02-07 03:25

    Note: This relates to older versions of VB.net Prior to Visual Studio 2010 and VB.net 10

    The difference is that in VB.Net a lambda expression must return a value i.e. they must be functions not subs. The lambda expression eventRaised = true is being interpreted as a boolean expression rather than an assignment i.e. is evaluating to false rather than setting to true.

    Further details on MSDN.

    I'm don't think the c# pattern for testing events used in the example can be done in VB.Net without introducing another function e.g.

    <TestFixture()> _
    Public Class Test
        <Test()> _
        Public Sub EventTest()
            Dim eventClass As New EventClass
            Dim eventRaised As Boolean = False
            AddHandler eventClass.AnEvent, Function() (SetValueToTrue(eventRaised))
            eventClass.RaiseIt()
            Assert.IsTrue(eventRaised)
        End Sub
    
        Private Function SetValueToTrue(ByRef value As Boolean) As Boolean
            value = True
            Return True
        End Function
    
    End Class
    
    Public Class EventClass
        Public Event AnEvent()
        Public Sub RaiseIt()
            RaiseEvent AnEvent()
        End Sub
    End Class
    
    0 讨论(0)
提交回复
热议问题