Wie Lambda-Event-Handler in VB.Net erklären?
-
03-07-2019 - |
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();
}
}
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 Sub
s 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 ...