2015-08-27 20 views
6

में उप के बजाय फ़ंक्शन के उपयोग के कारण बग की वजह से मैंने अभी एक ऐसी स्थिति में आ गया है जहां एक सहयोगी ने एक बग लिखा था और हमें नहीं पता था कि यह क्यों हुआ जब हम इसे ठीक करने के बारे में जानते हैं। मैं वर्षों से लैम्डा एक्सप्रेशन का उपयोग कर रहा हूं लेकिन वीबी की तुलना में सी # के साथ और अधिक अनुभवी हूं और मुझे स्पष्ट रूप से कुछ की मौलिक गलतफहमी है।सिंगल लाइन लैम्ब्डा अभिव्यक्ति

निम्नलिखित Visual Studio 2010 में .NET 3.5 के साथ देखा गया है।

मैं निम्नलिखित साधारण परीक्षण कोड है कि एक समान परिदृश्य reproduced को यह नीचे सरल बना दिया है:

एक खिड़कियों पर फार्म मैं निम्नलिखित शब्दों में कहें, बस एक लैम्ब्डा पर अमल और उसके बाद के लिए एक परीक्षण वस्तु के मूल्य मुद्रित करने के लिए एक टेक्स्टबॉक्स:

Private Sub ExecuteAction(ByVal action As Action(Of TestClass)) 
    Dim testObj As New TestClass() 
    action(testObj) 
    TextBox1.Text = testObj.MyInteger 
End Sub 

Public Class TestClass 
    Public MyInteger As Integer 
End Class 

और फिर मैं इसे लैम्ब्डा का उपयोग करके कॉल करने के लिए कुछ कोड चलाता हूं।

निम्नलिखित मामले में पाठ बॉक्स में उत्पादन 15 है के रूप में मैं उम्मीद करेंगे:

ExecuteAction(Sub(obj) obj.MyInteger = 15) 

निम्नलिखित मामले में उत्पादन भी 15 के रूप में मैं उम्मीद होती है (यह क्योंकि कोई वापसी मान एक चेतावनी उत्पन्न करता है निर्दिष्ट किया जाता है, जो मैं समझता हूँ और ठीक है, क्योंकि यह क्या उम्मीद है करता है):

ExecuteAction(Function(obj) 
       obj.MyInteger = 15 
       End Function) 

निम्नलिखित मामले में उत्पादन 0 और मुझे समझ नहीं आता क्यों:

ExecuteAction(Function(obj) obj.MyInteger = 15) 

अंतिम परिदृश्य में वस्तु का मूल्य 15 में क्यों नहीं बदलता है? मुझे यह देखने के लिए कि क्या मुझे समान बग के लिए हमारे सभी उत्पादों को जांचना है या नहीं, मुझे सिंगल लाइन फ़ंक्शन लैम्बडास और मल्टी लाइन फ़ंक्शन लैम्बडास के बीच इस अंतर को समझने की आवश्यकता है। यह ठीक से संकलित करता है और चेतावनियां उत्पन्न नहीं करता है जो हमारे उपयोगों के लिए बेहद खतरनाक बनाता है।

मैं अगर यह कोई फर्क किसी भी अंतर्निहित वापसी से पहले निष्पादन के लिए मजबूर किया जाता है देखने के लिए निम्नलिखित की कोशिश की लेकिन उसने ऐसा नहीं किया:

ExecuteAction(Function(obj) (obj.MyInteger = 15)) 

उत्तर

9

बहु लाइन और सिंगल लाइन कार्यों के बीच अंतर है कि एक एक में शामिल है कथन और दूसरे में एक अभिव्यक्ति है।

जब obj.MyInteger = 15 एक बयान है तो = असाइनमेंट ऑपरेटर है। जब यह एक अभिव्यक्ति है तो = तुलना ऑपरेटर है।

अपने एकल लाइन समारोह की बहु लाइन संस्करण है:

ExecuteAction(Function(obj) 
    Return obj.MyInteger = 15 
End Function) 

यह मूल्यों की तुलना और एक बूलियन मान वापस आ जाएगी। Action(Of TestClass) की अपेक्षा की जाती है, वापसी मूल्य के प्रकार पर कोई आवश्यकता नहीं है, इसलिए आप ध्यान नहीं देते कि यह एक बूलियन मान देता है।

+0

धन्यवाद, यह समझ में आता है। स्पष्ट रूप से प्रत्यक्ष स्थिति सी # में नहीं हो सकती क्योंकि इसकी तुलना के लिए == है और = असाइनमेंट के लिए जो मुझे भ्रमित करता है। मैं सुनिश्चित करूँगा कि हमारे प्रोग्रामिंग मानकों को अपडेट किया गया है और यह जांचने के लिए एक निर्णय कॉल करें कि यह हमें कहीं और पकड़ा गया है। एक बार फिर धन्यवाद। –

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