문제

다음 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) 이후, 익명 SubS는 작동하므로 다음과 같은 글을 쓸 수 있습니다.

Sub() eventRaised = True

간단히 말해서, 당신은 당분간 VB에서 그것을 할 수 없습니다 (다음 릴리스를 위해 고려 된 기능 목록에 있습니다). 선언 된 방법과 연산자 주소를 사용해야합니다.

VB 팀은 익명 대표를 언어에 포함시킬 시간이 없었습니다 (기술적으로 람다 표현이 아닌 사용하려는 것입니다).

LINQ가 실제로 작동 할 수 있도록 람다 표현식이 구현해야했습니다. 익명 대표단은 아무것도 요구하지는 않지만 매우 유용합니다. LINQ와 같은 것들을 XML 및 XML 쓰레기와 같은 것을 마무리하고 구문에서 더 많은 쿼리 연산자를 통합하는 데 더 많은 시간을 보냈다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top