vb.net에서 Lambda 이벤트 처리기를 선언하는 방법은 무엇입니까?
-
03-07-2019 - |
문제
다음 vb.net 코드는 진행 C# 코드와 동일하다고 생각합니다. 그러나 VB.NET 테스트가 실패합니다. 이벤트 처리 람다는 절대로 호출되지 않습니다.
무슨 일이 일어나고 있습니까?
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
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();
}
}
해결책 2
메모: 이것은 Visual Studio 2010 및 VB.net 10 이전의 이전 버전의 vb.net과 관련이 있습니다.
차이점은 vb.net에서 lambda 표현식은 값을 반환해야한다는 것입니다. 즉, 그들은 서브가 아닌 함수이어야합니다. 람다 표현 eventRaised = true
과제보다는 부울 표현으로 해석되고 있습니다. 즉, IE는 참으로 설정하기보다는 거짓으로 평가하고 있습니다.
자세한 내용 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
다른 팁
지금이 질문을 찾는 사람들은 : Visual Basic 2010 (VB 10.0) 이후, 익명 Sub
S는 작동하므로 다음과 같은 글을 쓸 수 있습니다.
Sub() eventRaised = True
간단히 말해서, 당신은 당분간 VB에서 그것을 할 수 없습니다 (다음 릴리스를 위해 고려 된 기능 목록에 있습니다). 선언 된 방법과 연산자 주소를 사용해야합니다.
VB 팀은 익명 대표를 언어에 포함시킬 시간이 없었습니다 (기술적으로 람다 표현이 아닌 사용하려는 것입니다).
LINQ가 실제로 작동 할 수 있도록 람다 표현식이 구현해야했습니다. 익명 대표단은 아무것도 요구하지는 않지만 매우 유용합니다. LINQ와 같은 것들을 XML 및 XML 쓰레기와 같은 것을 마무리하고 구문에서 더 많은 쿼리 연산자를 통합하는 데 더 많은 시간을 보냈다고 생각합니다.