كيف يتم الإعلان عن معالجات أحداث lambda في VB.Net؟
-
03-07-2019 - |
سؤال
أعتقد أن كود 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)، Sub
s مجهول القيام بعمل، حتى تتمكن من كتابة شيء من هذا القبيل:
Sub() eventRaised = True
وقصة قصيرة طويلة، لا تستطيع أن تفعل ذلك في VB في الوقت الراهن (كان على قائمة من الميزات النظر في الإصدار التالي). لديك لاستخدام أسلوب أعلنت والمشغل AddressOf.
فريق VB لم يكن لديك الوقت لتشمل مندوبين المجهول في اللغة (وهو ما تحاول استخدام، من الناحية الفنية ليس التعبير امدا).
وتعبيرات لامدا كان لديهم لتنفيذ بحيث ينق يمكن أن تعمل في الواقع. ليس مطلوبا من المندوبين مجهول من قبل أي شيء (ولكن سيكون من المفيد جدا). أعتقد أنها تنفق المزيد من الوقت على اختتام أشياء مثل ينق لXML و XML litterals ودمج المزيد من المشغلين الاستعلام في بناء الجملة ...