Cómo declarar lambda controladores de eventos en VB.Net?

Yo creo que el siguiente VB.Net el código es el equivalente del procedimiento de código de C#; sin embargo el VB.Net prueba de falla – el manejo de eventos Lambda nunca es llamado.

¿Qué está pasando?

VB.Net versión – 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

La versión de 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();
        }
    }
InformationsquelleAutor Gareth D | 2008-10-15

3 Kommentare

  1. 18

    Para aquellos encontrar a esta pregunta: desde Visual Basic 2010 (VB 10.0), anónimo Subs de hacer el trabajo, así que usted puede escribir algo como:

    Sub() eventRaised = True
    • Lo que si hay más de una declaración de seguir Sub (a)?
    • Entonces usted puede hacer: Sub() statement1 statement2 End Sub (cuatro líneas).
  2. 16

    Nota: Esto se relaciona con las 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 que deben ser las funciones no subs. La expresión lambda eventRaised = true se interpreta como una expresión booleana en lugar de una asignación es decir, evalúa a false en lugar de establecer a true.

    Más detalles sobre MSDN.

    Estoy no creo que el c# patrón para eventos de pruebas utilizado en el ejemplo, se puede hacer en VB.Net sin la introducción de 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
    • Realmente screawed con las lambdas en VB.Net.
    • De acuerdo, parece que lo hizo por la mínima a obtener enlace va y eso fue todo.
    • Tenga en cuenta que como de VS2010 VB.Net las lambdas de ahora puede ser subrutinas y no necesita devolver un valor.
  3. 2

    Larga historia corta, no se puede hacer eso en VB por el momento (se encuentra en la lista de características consideradas para la próxima versión). Usted tiene que usar un método declarado y el operador AddressOf.

    La VB equipo no tiene el tiempo para incluir los delegados anónimos en la lengua (que es lo que usted está tratando de usar, técnicamente no es una expresión lambda).

    Expresiones Lambda tuvieron que implementar para que Linq realmente funciona. Los delegados anónimos no son requeridos por cualquier cosa (pero sería bastante útil). Supongo que pasó más tiempo en el embalaje de las cosas como Linq To XML y XML litterals y la integración de más operadores de consulta en la sintaxis…

    • Se entiende que este es un anónimo delegado y no una expresión lambda. Sin embargo, es la siguiente (que sí funciona) un anónimo delegado en VB?: AddHandler eventClass.AnEvent, la Función() (SetValueToTrue(eventRaised))

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea