如何在VB.Net中声明lambda事件处理程序? [英] How to declare lambda event handlers in VB.Net?

查看:157
本文介绍了如何在VB.Net中声明lambda事件处理程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我相信以下VB.Net代码相当于进行中的C#代码;但是VB.Net测试失败 - 事件处理Lambda从来没有被调用过。



发生了什么?



VB.Net版本 - 失败:

 < TestFixture()> _ 
公共类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
结束类

公共类EventClass
公共事件AnEvent()
Public Sub RaiseIt()
RaiseEvent AnEvent()
End Sub
结束类

C#版本 - pass:

  [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();
}
}


解决方案


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


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



有关 MSDN 的更多详细信息。



我不认为在示例中使用的测试事件的c#模式可以在VB.Net中完成,而不引入其他功能,例如

 < TestFixture()> _ 
公共类测试
< 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

私有函数SetValueToTrue(ByRef value As Boolean)As Boolean
value = True
返回True
结束函数

结束类

公共类EventClass
公共事件AnEvent()
Public Sub RaiseIt()
RaiseEvent AnEvent()
End Sub
结束类


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 on?

VB.Net version - fails:

<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

C# version - passes:

[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();
        }
    }

解决方案

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

这篇关于如何在VB.Net中声明lambda事件处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆