如何在VB.Net中声明lambda事件处理程序?

Gar*_*h D 20 c# vb.net events lambda unit-testing

我相信以下VB.Net代码相当于正在进行的C#代码; 但VB.Net测试失败 - 从未调用处理Lambda的事件.

到底是怎么回事?

VB.Net版本 - 失败:

<TestFixture()> _
Public Class TestClass
    <Test()> _
    Public Sub EventTest()
        Dim eventClass As New EventClass
        Dim eventRaised As Boolean = False
        AddHandler eventClass.AnEvent, Function() (eventRaised = True)
        eventClass.RaiseIt()
        Assert.IsTrue(eventRaised)
    End Sub    
End Class

Public Class EventClass
    Public Event AnEvent()
    Public Sub RaiseIt()
        RaiseEvent AnEvent()
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

C#版本 - 通过:

[TestFixture]
    public class TestClass
    {
        [Test]
        public void EventTest()
        {
            var eventClass = new EventClass();
            var eventRaised = false;
            eventClass.AnEvent += () => { eventRaised = true; }; 
            eventClass.RaiseIt();
            Assert.IsTrue(eventRaised);
        }
    }

    public class EventClass
    {
        public delegate void EventHandler();
        public event EventHandler AnEvent;
        public void RaiseIt()
        {
            AnEvent();
        }
    }
Run Code Online (Sandbox Code Playgroud)

svi*_*ick 18

对于那些现在发现这个问题的人:自Visual Basic 2010(VB 10.0)以来,匿名Subs确实有用,所以你可以这样写:

Sub() eventRaised = True
Run Code Online (Sandbox Code Playgroud)

  • @LeiYang然后,您可以执行以下操作:Sub()statement1 statement2 End Sub(四行)。 (2认同)

Gar*_*h D 16

注意:这与Visual Studio 2010和VB.net 10之前的旧版VB.net有关

区别在于,在VB.Net中,lambda表达式必须返回一个值,即它们必须是函数而不是subs.lambda表达式eventRaised = true被解释为布尔表达式而不是赋值,即评估为false而不是设置为true.

有关MSDN的更多详细信息.

我不认为用于测试示例中的事件的c#模式可以在VB.Net中完成而不引入另一个函数,例如

<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
Run Code Online (Sandbox Code Playgroud)

  • 他们真的在VB.Net中使用lambdas. (15认同)
  • 请注意,从VS2010开始,VB.Net lambdas现在可能是子例程,无需返回值. (4认同)