2011-08-22 16 views
5

मुझे पता है कि एक लैम्ब्डा अभिव्यक्ति क्या है।अभिव्यक्ति बनाम Lambdas

लेकिन मुझे यकीन नहीं है कि यह Expression जैसा ही है। मुझे पता है कि यहां से कहीं ज्यादा पता है।

मैं wrapping IQueryable पर देख रहा हूं और यह अभिव्यक्तियों का बहुत उपयोग करता है। तो, उदाहरण के लिए, लैम्ब्डा में विचार किए जाने के बजाय यहां 'अभिव्यक्ति' पैरामीटर के लिए और कुछ है?

public InterceptedQuery(InterceptingProvider provider, Expression expression) 
{ 
    this._provider = provider; 
    this._expression = expression; 
} 

उत्तर

4

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

  • एक (छुपा) समारोह और एक प्रतिनिधि
  • एक Expression

एक बार आवेदन संकलित हो जाने के बाद, लैम्ब्डा अभिव्यक्ति की अवधारणा मौजूद नहीं है, क्योंकि यह tu है उपर्युक्त दो विकल्पों में से एक में घुमाया गया।

मुझे यकीन है कि आप द्वारा

क्या मतलब है नहीं कर रहा हूँ वहाँ 'अभिव्यक्ति' पैरामीटर के लिए और अधिक यहाँ की तुलना में एक लैम्ब्डा

कोई व्यंजक समाहित में के बारे में सोचा जा सकता है और एप्लिकेशन तर्क व्यक्त एक अभूतपूर्व रूप में (दूसरे शब्दों में, यह आपको यह देखने देता है कि डेवलपर ने गुणों और कार्यों के संदर्भ में क्या लिखा है, स्थिरांक शामिल हैं, तुलना आदि)। इस प्रकार क्वेरी प्रदाता (अधिकांश भाग के लिए, एंटीटी फ्रेमवर्क जैसे ऑब्जेक्ट-रिलेशनल मैपर) कोड लेते हैं और इसे SQL में बदल देते हैं।

+0

+1 उत्कृष्ट जवाब। सटीक!!! – gideon

1

लैम्ब्डा आमतौर पर संकलित कोड होते हैं, जहां अभिव्यक्ति "अमूर्त वाक्यविन्यास पेड़" (एएसटी) का प्रतिनिधित्व करती है, यानी। डेटा संरचना जो कोड का प्रतिनिधित्व करती है, और कोड में संकलित की जा सकती है। IQueryable आमतौर पर अभिव्यक्ति पर काम करता है क्योंकि यह एएसटी को उस कोड में संकलित करना है जो कि विभिन्न मशीनों में चलता है, जैसे कि मेजबान मशीन की बजाय, SQL सर्वर की तरह। IQueryableProviders हैं जो SQL (Linq2Sql), जावास्क्रिप्ट को ओपनजीएल शेडर्स (ब्लिंग), और अधिक में संकलित करते हैं।

सी # संकलक कभी कभी, एक अभिव्यक्ति में एक लैम्ब्डा चालू कर सकते हैं विधि पैरामीटर सही प्रकार की अभिव्यक्ति की उम्मीद:

void Foo(Expression<Func<int>>) { ... } 
... 
Foo(() => 3); 
+0

"लैम्बडास आम तौर पर संकलित कोड होते हैं" यह गलत है, जबकि लैम्ब्डा का निश्चित रूप से संकलित कोड बनाने के लिए उपयोग किया जा सकता है (वे छिपे हुए, कंपाइलर-जेनरेट किए गए कार्यों के प्रतिनिधि बन जाते हैं), इन्हें 'अभिव्यक्ति' ऑब्जेक्ट्स बनाने के लिए भी उपयोग किया जाता है; जो भी बनाया गया है वह संदर्भ द्वारा निर्धारित किया जाता है। मैं डाउनवोट करने जा रहा हूं, क्योंकि एएसटी पर आपकी जानकारी निश्चित रूप से सही है, लेकिन पहली वाक्य का तात्पर्य है कि लैम्ब्डा और अभिव्यक्तियों के बीच एक अंतर है। –

+0

* आम तौर पर * पर जोर। लैम्बडास की पूर्ण अभिव्यक्ति शक्ति केवल इस समय प्रतिनिधियों के लिए उपलब्ध है, क्योंकि "कथन लैम्बदास" अभिव्यक्तियों को संकलित नहीं कर सकता है। अभिव्यक्ति लैम्बदास का एक गरीब उप-समूह है। मैं यह भी अनुमान लगाता हूं कि लैम्ब्डा का अधिकांश उपयोग सिस्टम.लिंक है, जो प्रतिनिधियों का उपयोग करता है, लेकिन शायद मैं उस अनुमान पर पक्षपातपूर्ण हूं। – naasking

+0

मैं वहां असहमत हूं; मुझे लगता है कि अधिकांश LINQ कथन LINQ-to-SQL या Entity Framework क्वेरीज़ के हिस्से के रूप में आते हैं (अन्य ओआरएम का स्पष्ट रूप से समर्थन अभिव्यक्ति वाक्यविन्यास भी समर्थन करता है, लेकिन मुझे नहीं लगता कि उनका उपयोग कहीं भी ईएफ या एल 2 एस जितना अधिक होगा)।मुझे लगता है कि तथ्य यह है कि स्टैक ओवरव्लो संदर्भ पर "LINQ" प्रश्नों का भारी बहुमत उन दो ढांचे में से एक है (ईएफ बहुमत के रूप में लेना शुरू कर रहा है, लेकिन एल 2 एस कोई स्लच नहीं है)। –

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