2011-09-01 7 views
8

यह कोड कैसे काम करता है?इस कोड का अर्थ क्या है (एस, ई)?

 app.InstallStateChanged += (s, e) => UpdateUI(); 
     NetworkChange.NetworkAddressChanged += 
      (s, e) => UpdateNetworkIndicator(); 

क्या कोई इसे इस तरह से अनसुलझा कर सकता है?

कोड एक Silverlight 4 OOB सिस्टम http://msdn.microsoft.com/en-us/library/dd833066(v=VS.95).aspx

UpdateNetworkIndicator कुछ भी वापस नहीं करता है में प्रयोग किया जाता एक उदाहरण से आता है। UpdateUI कुछ भी वापस नहीं करता है।

उत्तर

6

अद्यतनयूआई() और UpdateNetworkIndicator() विधियां दोनों कस्टम ईवेंट हैंडलर विधियां हैं।

+ = ऑपरेटर क्रमशः ऐप और नेटवर्क चेंज द्वारा निकाली गई घटनाओं में इन ईवेंट हैंडलर को जोड़ रहा है।

=> एक लैम्ब्डा अभिव्यक्ति को दर्शाता है। (एस, ई) इनपुट पैरामीटर हैं (इस मामले में, मानक प्रेषक, घटना का तर्क है) और => का विवरण कथन या अभिव्यक्ति है।

इस मामले में, आप इस के रूप में फिर से लिखने सकता है:

app.InstallStateChanged += UpdateUI; 
NetworkChange.NetworkAddressChanged += UpdateNetworkIndicator; 

और यह सिर्फ रूप में अच्छी तरह काम करना चाहिए।

+0

इस के साथ आपकी मदद के लिए सभी को धन्यवाद! मैंने इसे एक चुनौती दी है क्योंकि यह उलझन में कुछ समझता है जो मैं समझता हूं लेकिन मैं उन अन्य टिप्पणियों की सराहना करता हूं जिन्होंने मेरी समझ में सुधार किया है। – Hunt

9

यह एक लैम्ब्डा अभिव्यक्ति है।

"सभी लैम्ब्डा भाव लैम्ब्डा ऑपरेटर =>, जो के रूप में पढ़ा जाता है का उपयोग करें"। लैम्ब्डा ऑपरेटर के बाईं ओर इनपुट पैरामीटर निर्दिष्ट करता है (यदि हो तो) और दाईं ओर अभिव्यक्ति धारण करने के लिए "चला जाता है या बयान ब्लॉक। लैम्ब्डा अभिव्यक्ति एक्स => x * x पढ़ने के लिए है "एक्स के लिए एक्स बार एक्स चला जाता है।"

http://msdn.microsoft.com/en-us/library/bb397687.aspx

1

InstallStateChanged और NetworkAddressChanged घटनाक्रम कर रहे हैं, क्या you're देख रही है यदि संबंधित घटनाओं को निकाल दिया जाता है तो UpdateUI या UpdateNetworkIndicator को कॉल करने के लिए ईवेंटहैंडर को परिभाषित करने के लिए लैम्ब्डा सिंटैक्स।

9

यह एक lambda expression है जिसमें एकाधिक पैरामीटर शामिल हैं। इस मामले में (जैसा कि आप किसी ईवेंट हैंडलर को प्रतिस्थापित करने के लिए फ़ंक्शन का उपयोग कर रहे हैं) वे object और EventArgs पैरामीटर के बराबर हैं।

आपका कोड नीचे

app.InstallStateChanged += OnInstallStateChanged; 
NetworkChange.NetworkAddressChanged += OnNetworkAddressChanged; 

/* ... */ 

private void OnInstallStateChanged(object s, EventArgs e) 
{ 
    UpdateUI(); 
} 

private void OnNetworkAddressChanged(object s, EventArgs e) 
{ 
    UpdateNetworkIndicator(); 
} 
+1

+1 यह उत्तर मेरा वोट प्राप्त करता है। एक __good__ stackoverflow उत्तर आईएमओ के लिए उचित पैटर्न सेट करता है। – AnthonyWJones

2

के बराबर है इस उदाहरण पर विचार

Button1.Click += (s, e) => log(e); 

Button1.Click += new EventHandler(Button1_Click); 

और

के लिए (लैम्ब्डा अभिव्यक्ति का प्रयोग करके) कम हाथ है
1

उस वाक्यविन्यास को Lambda Expression कहा जाता है।MSDN से,

एक लैम्ब्डा अभिव्यक्ति को उस अज्ञात फ़ंक्शन भाव और बयानों शामिल कर सकते हैं, और प्रतिनिधियों या अभिव्यक्ति पेड़ प्रकार बनाने के लिए इस्तेमाल किया जा सकता है।

और (s, e) बनाए गए प्रतिनिधि या अभिव्यक्ति वृक्ष के इनपुट पैरामीटर घोषित करें। जब एकल इनपुट पैरामीटर होता है, तो कोष्ठक की आवश्यकता नहीं होती है और आप केवल s => ... लिख सकते हैं। जब एक से अधिक पैरामीटर होते हैं, तो ब्रांड्स की आवश्यकता होती है - (s, e) =>

1

संक्षेप में, एस और ई उन वस्तुओं को संदर्भित करते हैं जिनके गुण कार्य लक्ष्यीकरण कर रहे हैं। कोड व्यक्त कर रहा है: आपके पास इस फ़ंक्शन में दो प्रकार की ऑब्जेक्ट्स हैं जिन्हें आप एक्सेस कर सकते हैं। जब इस फ़ंक्शन को बुलाया जाता है, तो ऑब्जेक्ट से यह या उस प्रॉपर्टी को प्राप्त होता है और इसके मान का उपयोग निम्न तरीके से करता है।

तो एक काल्पनिक संदर्भ में

एस एक स्ट्रिंग ई किसी पूर्णांक

(रों, ई) => है

मतलब है कि समारोह में आगे के संदर्भ उन संबंधित वस्तु की बात कर रहे है नाम एस और ई के प्रकार।

(रों, ई) => s.Length + ई

मतलब: एक स्ट्रिंग जो है को संदर्भित करता है के कहने का मूल्य मिलता है और इसे करने के लिए एक पूर्णांक के कहने के मूल्य जोड़ने जो ई करने के लिए संदर्भित करता है।

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