2008-10-15 10 views
19

मेरा मानना ​​है कि निम्नलिखित वीबी.Net कोड कार्यवाही सी # कोड के बराबर है; हालांकि वीबी.Net परीक्षण विफल रहता है - घटना संभालने वाला कार्यक्रम लैम्ब्डा कभी नहीं कहा जाता है।VB.Net में लैम्ब्डा ईवेंट हैंडलर घोषित कैसे करें?

क्या चल रहा है?

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 

सी # संस्करण - पास:

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

उत्तर

16

नोट: दृश्य स्टूडियो 2010 से पहले इस VB.net के पुराने संस्करणों से संबंधित है और वीबीनेट 10

अंतर है VB.Net में एक लैम्ब्डा अभिव्यक्ति को एक मान वापस करना होगा यानी वे कार्य नहीं होना चाहिए। लैम्ब्डा अभिव्यक्ति eventRaised = true को असाइनमेंट की बजाय बूलियन अभिव्यक्ति के रूप में व्याख्या किया जा रहा है यानी सत्य पर सेट करने के बजाए झूठ का मूल्यांकन कर रहा है।

MSDN पर और जानकारी।

मुझे नहीं लगता कि उदाहरण में उपयोग की जाने वाली घटनाओं का परीक्षण करने के लिए सी # पैटर्न 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 
+14

वे वास्तव में वीबी.Net में लैम्ब्स के साथ डूब गए। – chrissie1

+0

सहमत हैं, ऐसा लगता है कि उन्होंने कम से कम लिंक प्राप्त करने के लिए किया था और यही वह था। –

+4

ध्यान दें कि VS2010 VB.Net lambdas के रूप में अब subroutines हो सकता है और एक मूल्य वापस नहीं करने की आवश्यकता है। –

2

लंबी कहानी संक्षेप में, आप कुछ समय के (यह अगली फिल्म के लिए विचार सुविधाओं की सूची में है) के लिए ऐसा नहीं कर सकते कि VB में। आपको घोषित विधि और पताऑफ ऑपरेटर का उपयोग करना होगा।

वीबी टीम में भाषा में अज्ञात प्रतिनिधियों को शामिल करने का समय नहीं था (जो आप उपयोग करने का प्रयास कर रहे हैं, तकनीकी रूप से लैम्ब्डा अभिव्यक्ति नहीं)।

लैम्ब्डा अभिव्यक्तियों को उन्हें लागू करना था ताकि लिंक वास्तव में काम कर सके। बेनामी प्रतिनिधियों को कुछ भी आवश्यक नहीं है (लेकिन काफी उपयोगी होगा)। मुझे लगता है कि उन्होंने लिंक टू एक्सएमएल और एक्सएमएल लिटरल्स जैसी चीजों को लपेटने और सिंटैक्स में अधिक क्वेरी ऑपरेटरों को एकीकृत करने में अधिक समय बिताया है ...

+0

समझा कि यह एक अज्ञात प्रतिनिधि है और लैम्ब्डा अभिव्यक्ति नहीं है। हालांकि, निम्नलिखित है (जो काम करता है) वीबी में एक अज्ञात प्रतिनिधि है ?: AddHandler eventClass.AnEvent, फ़ंक्शन() (SetValueToTrue (eventRaised)) –

15

अब यह प्रश्न ढूंढने वालों के लिए: विजुअल बेसिक 2010 (वीबी 10.0), अज्ञात Sub काम करते हैं, तो आप कुछ लिख सकते हैं जैसे:

Sub() eventRaised = True 
+0

यदि एक से अधिक कथन उप() का पालन करते हैं तो क्या होगा? –

+1

@LeiYang तो आप कर सकते हैं: 'उप() कथन 1 कथन 2 एंड सब' (यह चार पंक्तियां) है। – svick

संबंधित मुद्दे