Frage

Ich glaube, die folgende VB.Net Code das Äquivalent des Verfahrens C # -Code ist; aber der VB.Net Test nicht bestehen -. das Ereignis Lambda Umgang nie aufgerufen

Was ist da los?

VB.Net Version - nicht:

<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 - Pässe:

[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();
        }
    }
War es hilfreich?

Lösung 2

  

Hinweis: Dies bezieht sich auf ältere Versionen von VB.net Vor Visual Studio 2010 und VB.net 10

Der Unterschied ist, dass in VB.Net ein Lambda-Ausdruck einen Wert zurückgeben muss das heißt, sie Funktionen nicht subs sein müssen. Die Lambda-Ausdruck eventRaised = true als Booleschen Ausdruck interpretiert werden, anstatt eine Zuweisung heißt auf unwahr Auswertung statt auf true setzen.

Weitere Informationen über MSDN .

Ich bin glaube nicht, das c # Muster für Veranstaltungen im Beispiel testen können, ohne dass eine andere Funktion beispiels in VB.Net erfolgen.

<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

Andere Tipps

Für diejenigen, diese Frage zu finden, jetzt: seit Visual Basic 2010 (VB 10,0), anonyme Subs Arbeit zu tun, so dass Sie so etwas wie schreiben:

Sub() eventRaised = True

Lange Rede kurzer Sinn, können Sie nicht, dass für die Zeit, in VB zu tun ist (es ist auf der Liste der Funktionen für die nächste Version berücksichtigt). Sie haben eine deklarierte Methode und den AddressOf-Operator verwenden.

Das VB-Team hat nicht die Zeit anonym Delegierten in der Sprache enthält (das ist, was Sie versuchen, zu verwenden, technisch keine Lambda-Ausdruck).

Lambda-Ausdrücke hatten sie so zu implementieren, dass Linq tatsächlich funktionieren kann. Anonyme Delegierten sind durch nichts (aber wäre ganz nützlich) erforderlich. Ich denke, sie mehr Zeit damit verbracht auf Einwickeln Dinge wie LINQ to XML und XML litterals und Abfrageoperator in der Syntax Integration ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top