2011-07-26 12 views
15

सभी से पूछने के लिए खेद है, लेकिन मैं एक पुराना हाथ Vb.net लड़का हूं जो सी # में स्थानांतरित हो रहा है। मेरे पास कोड का निम्न भाग है जो सक्रिय होता है जब (इस मामले में) postAsync विधि निकाल दी जाती है। मैं सिर्फ डॉन टी समझते हैं कि कोड क्या कर रहा है (इस प्रकार): -+ = (ओ, तर्क) => वास्तव में क्या प्राप्त कर रहा है?

app.PostCompleted += 
    (o, args) => 
    { 
     if (args.Error == null) 
     { 
      MessageBox.Show("Picture posted to wall successfully."); 
     } 
     else 
     { 
      MessageBox.Show(args.Error.Message); 
     } 
    }; 

अगर कोई समझा सकता है क्या + = (ओ, args) => वास्तव में प्राप्त करने जाता है तो मैं बहुत आभारी होंगे .. ..

अग्रिम में बहुत धन्यवाद। टिम

उत्तर

26

(o,args) => एक लैम्ब्डा अभिव्यक्ति है कि o और args नाम के दो पैरामीटर लेता है परिभाषित करता है। उन पैरामीटर के प्रकार PostCompleted के प्रकार के अनुसार अनुमानित हैं (यदि PostCompletedEventHandler है, तो वे क्रमशः Object और EventArgs टाइप करेंगे)। अभिव्यक्ति का शरीर => के बाद आता है।

परिणाम हैंडलर के रूप में PostCompleted पर जोड़ा गया है।

app.PostCompleted += delegate(object o, EventArgs args) 
{ 
    // ... 
}; 

कौन सा के लिए एक आशुलिपि है:

इस प्रकार, यह एक कम वर्बोज़ तरह से लिखने के लिए है

void YourHandler(object o, EventArgs args) 
{ 
    // ... 
} 

// ... 

app.PostCompleted += YourHandler; 
+8

जो 'ऐप' के लिए स्वयं, शॉर्टेंड है। पोस्ट पूर्ण + = नया इवेंट हैंडलर (आपका हैंडलर); '। – Shibumi

+0

आपको "नया इवेंट हैंडलर" रखने की भी आवश्यकता नहीं है। सी # कंपाइलर यह समझने के लिए पर्याप्त स्मार्ट है कि किस प्रतिनिधि का उपयोग करना है। तो एक छोटा शॉर्टकट 'ऐप है। पोस्ट पूर्ण + = आपका हैंडलर; ' – Sung

+4

@ सुंग मुझे लगता है कि उसने वही कहा है। –

8

यह लैम्ब्डा अभिव्यक्ति का उपयोग करके पोस्ट पूर्ण घटना के लिए एक अतिरिक्त हैंडलर है। यह

app.PostCompleted += MyHandler; 

    // ... 

    private void MyHandler(object sender, EventArgs e) { 
     // ... 
    } 

लेकिन लैम्ब्डा अभिव्यक्तियों का उपयोग करते समय, आप आसानी से हैंडलर को अलग नहीं कर सकते हैं।

5

यह एक प्रतिनिधि पोस्ट पूरा होने के अवसर के लिए ईवेंट हैंडलर को परिभाषित करने के लिए आशुलिपि है:

app.PostCompleted += delegate(object o, EventArgs args) { 
    // ... 
}; 

Anonymous Methods भी देखें।

3

मान लीजिए PostCompleted एक घटना है, आप मूल रूप से लैम्ब्डा नोटेशन का उपयोग करके एक ईवेंट हैंडलर बना रहे हैं।

app.PostCompleted += delegate (o, args) 
{ 
    if (args.Error == null) 
    { 
     MessageBox.Show("Picture posted to wall successfully."); 
    } 
    else 
    { 
     MessageBox.Show(args.Error.Message); 
    } 
}; 
2

(o,args) => हिस्सा एक lambda expression, एक गुमनाम समारोह है जो है:

यह कतरना कोड के बराबर है।

+= भाग घटना को आग लगने पर लैम्ब्डा अभिव्यक्ति को कॉल करने के लिए असाइन करता है।

+0

एमएसडीएन लिंक के लिए थानक्स ..... –

3

vb.net बराबर इस प्रकार दिखाई देगा:

AddHandler app.PostCompleted, Function(o, args) 
     ''# ... 
    End Function 

ध्यान दें कि यह दृश्य स्टूडियो 2010/नेट 4 आवश्यकता है, लेकिन सी # कोड विजुअल स्टूडियो 2008/नेट 3.5 में वापस काम करता है।

लेकिन यह केवल आंशिक रूप से सच है। सी # में, यह एक स्थान पर एक ईवेंट हैंडलर के रूप में एक विधि को परिभाषित करने का एक तरीका है। वीबी मेंनेट, आप Handles कीवर्ड का उपयोग कर सकते हैं, और इसलिए वास्तविक बराबर अधिक इस प्रकार दिखाई देंगे:

Public Sub App_PostCompleted(ByVal Sender as Object, ByVall e As EventArgs) Handles app.PostCompleted 
    ''# 
End Sub 

लेकिन फिर भी है कि पूरी तरह बराबर नहीं है, आप विधि एक नाम दिया है और यह कहीं से भी कॉल कर सकते हैं के बाद से। सी # कोड का एकमात्र संदर्भ (और इस प्रकार इसे कॉल करने का एकमात्र तरीका) ईवेंट सदस्यता के माध्यम से है।

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