سؤال

أعتقد أن كود VB.Net التالي يعادل كود C# الحالي؛ومع ذلك، فشل اختبار VB.Net - لا يتم استدعاء Lambda مطلقًا للتعامل مع الحدث.

ما الذي يجري؟

إصدار 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

ملحوظة: يتعلق هذا بالإصدارات الأقدم من VB.net قبل Visual Studio 2010 وVB.net 10

الفرق هو أنه في VB.Net، يجب أن يُرجع تعبير lambda قيمة، على سبيل المثال.يجب أن تكون وظائف وليس الغواصات.تعبير لامدا eventRaised = true يتم تفسيره على أنه تعبير منطقي بدلاً من مهمة، على سبيل المثال.يتم تقييمه على خطأ بدلاً من ضبطه على صحيح.

مزيد من التفاصيل على 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 في الوقت الراهن (كان على قائمة من الميزات النظر في الإصدار التالي). لديك لاستخدام أسلوب أعلنت والمشغل AddressOf.

فريق VB لم يكن لديك الوقت لتشمل مندوبين المجهول في اللغة (وهو ما تحاول استخدام، من الناحية الفنية ليس التعبير امدا).

وتعبيرات لامدا كان لديهم لتنفيذ بحيث ينق يمكن أن تعمل في الواقع. ليس مطلوبا من المندوبين مجهول من قبل أي شيء (ولكن سيكون من المفيد جدا). أعتقد أنها تنفق المزيد من الوقت على اختتام أشياء مثل ينق لXML و XML litterals ودمج المزيد من المشغلين الاستعلام في بناء الجملة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top