operator method expressions expresiones ejemplos c# vb.net unit-testing events lambda

c# - method - ¿Cómo declarar los controladores de eventos lambda en VB.Net?



lambda expressions c# where (3)

Para resumir, no puede hacer eso en VB por el momento (está en la lista de características consideradas para la próxima versión). Debe usar un método declarado y el operador AddressOf.

El equipo de VB no tuvo tiempo de incluir delegados anónimos en el idioma (que es lo que estás tratando de usar, técnicamente no es una expresión lambda).

Expresiones Lambda que tuvieron que implementar para que Linq realmente pueda funcionar. Los delegados anónimos no son requeridos por nada (pero serían bastante útiles). Supongo que dedicaron más tiempo a completar cosas como Linq To XML y XML liteterals e integrando más operadores de consulta en la sintaxis ...

Creo que el siguiente código VB.Net es el equivalente del código C # anterior; sin embargo, la prueba VB.Net falla: nunca se llama al evento que maneja Lambda.

Que esta pasando?

Versión VB.Net - falla:

<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

Versión C # - pases:

[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(); } }


Para aquellos que encuentran esta pregunta ahora: desde Visual Basic 2010 (VB 10.0), Sub s anónimos funcionan, por lo que puede escribir algo como:

Sub() eventRaised = True


Nota: Esto se relaciona con versiones anteriores de VB.net Antes de Visual Studio 2010 y VB.net 10

La diferencia es que en VB.Net una expresión lambda debe devolver un valor, es decir, deben ser funciones no subs. La expresión lambda eventRaised = true se interpreta como una expresión booleana en lugar de una asignación, es decir, se evalúa como falsa en lugar de establecerse como verdadera.

Más detalles en MSDN .

No creo que el patrón de c # para probar los eventos utilizados en el ejemplo se pueda hacer en VB.Net sin introducir otra función, por ejemplo

<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