2009-04-17 16 views
10

डुप्लिकेट:delegate keyword vs. lambda notationअंतर - सी #

मैं समझता हूँ गुमनाम तरीकों प्रतिनिधियों को परिभाषित करने और इनलाइन कार्यों लिखने के लिए इस्तेमाल किया जा सकता। Lambda अभिव्यक्तियों का उपयोग इस से अलग है?

मुझे लगता है कि मैं किस चीज का उपयोग करने के लिए थोड़ा उलझन में हूं।

संपादित करें: यह भी लगता है कि अज्ञात या लैम्बडास का उपयोग करने के लिए, प्रकार के लिए एक एक्सटेंशन विधि होना आवश्यक है?

उत्तर

4

वास्तव में नहीं। वे अनिवार्य रूप से अलग वाक्यविन्यास संरचनाओं के साथ एक ही विशेषता है। सामान्य शिफ्ट हालांकि अज्ञात अभिव्यक्तियों और कार्यों दोनों के लिए लैम्ब्डा स्टाइल सिंटैक्स की ओर सी # 2.0 अज्ञात विधि वाक्यविन्यास से दूर प्रतीत होता है।

15

एक लैम्ब्डा अभिव्यक्ति केवल अज्ञात विधि के लिए शॉर्टकट वाक्यविन्यास है। बेनामी तरीकों इस तरह दिखेगा:

delegate(params) {method body} 

बराबर लैम्ब्डा अभिव्यक्ति इस प्रकार दिखाई देगा:

params => method body 

संक्षेप में, सभी लैम्ब्डा भाव गुमनाम तरीके हैं, लेकिन यह एक गुमनाम तरीका है कि संभव है लैम्ब्डा सिंटैक्स में लिखा नहीं है (ऊपर दिए गए पहले उदाहरण की तरह)। उम्मीद है कि यह सहायक है!

+0

+1, लेकिन लैम्ब्डा अभिव्यक्ति सिर्फ पहिया को फिर से शुरू नहीं कर रहे हैं (बल्कि खराब, जैसा कि मैंने अज्ञात तरीकों को और अधिक समझ में लिया है)। –

+0

तो लैम्बाडा अभिव्यक्ति में वापसी मूल्य नहीं हो सकता है? जबकि अनाम विधि कर सकते हैं? –

+1

स्नॉर्फस: हाँ वे वही काम करते हैं ताकि आप सही हों, यह सिंटैक्स वरीयता का मामला है।साशा: दोनों भेड़ के बच्चे और अज्ञात तरीकों में वापसी मूल्य हो सकते हैं। –

6

लैम्ब्डा अभिव्यक्ति, अभिव्यक्ति के पेड़ में बदला जा सकता है, जबकि गुमनाम प्रतिनिधियों नहीं कर सकता।

5
विधि शरीर के बिना

केवल लैम्ब्डा अभिव्यक्ति अभिव्यक्ति पेड़ में बदला जा सकता

बाद निर्माणों संकलन कार्य करें:

  Func<int> exp1 =() => 1; 
      Func<int> exp2 =() => { return 1; }; 
      Func<int> exp3 = delegate { return 1; }; 
      Expression<Func<int>> exp4 =() => 1; 

और निम्न कार्य नहीं

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates 
Expression<Func<int>> exp6 =() => { return 1; }; //or lambdas with block body 

तो वहाँ है बहुत उन्नत स्तर पर भी अंतर (जो जॉन स्क यहां sick difference example)

एक और अंतर यह है कि यदि आप विधि शरीर के अंदर उन्हें उपयोग करने की योजना नहीं बनाते हैं तो आप पैरामीटर सूची के बिना अनाम प्रतिनिधि बना सकते हैं, लैम्ब्डा के साथ आपको हमेशा पैरामीटर प्रदान करना पड़ता है।

के बाद दो पंक्तियों अंतर

Func<int, int, int, int, int> anonymous = delegate { return 1; }; 
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1; 

आप अनिवार्य रूप से एक ही बात लेकिन अनाम प्रतिनिधि कर स्पष्ट रूप से यहाँ बेहतर लग रहा है का प्रदर्शन।

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