如何在VB.Net中声明lambda事件处理程序? [英] How to declare lambda event handlers in VB.Net?
问题描述
发生了什么?
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屋!