2010-06-26 7 views
7

के बीच अंतर अभिव्यक्ति और Func के बीच क्या अंतर है? एक ही कार्य दोनों द्वारा प्राप्त किया जा सकता है। तो अंतर क्या है?अभिव्यक्ति और Func

उत्तर

13

Expression treesडेटा तर्क के प्रतिनिधित्व - जिसका अर्थ है कि उन्हें LINQ प्रदाताओं जैसी चीजों द्वारा निष्पादन समय पर जांच की जा सकती है। वे कोड का अर्थ क्या कर सकते हैं, और संभवतः इसे किसी अन्य रूप में परिवर्तित कर सकते हैं, जैसे SQL।

Func प्रकार के परिवार, हालांकि, केवल प्रतिनिधि हैं। वे सामान्य आईएल के रूप में समाप्त होते हैं, जिन्हें सीधे निष्पादित किया जा सकता है, लेकिन (आसानी से) जांच नहीं की जाती है। ध्यान दें कि आप अभिव्यक्ति पेड़ों (अच्छी तरह से, Expression<T> और LambdaExpression) प्रतिनिधियों में संकलित कर सकते हैं और यदि आपको आवश्यकता हो तो प्रबंधित कोड के भीतर भी निष्पादित कर सकते हैं।

आप अभिव्यक्ति पेड़ मैन्युअल अभिव्यक्ति कक्षा में कारखाना तरीकों का उपयोग कर का निर्माण कर सकते हैं, लेकिन आम तौर पर आप सिर्फ तथ्य यह है कि सी # में बदल सकते हैं लैम्ब्डा दोनों अभिव्यक्ति के पेड़ और सामान्य प्रतिनिधियों में भाव का उपयोग करें:

Expression<Func<int, int>> square = x => x * x; 
Func<int, int> square = x => x * x; 

ध्यान दें कि ऐसी सीमाएं हैं जिन पर लैम्ब्डा अभिव्यक्ति अभिव्यक्ति पेड़ों में परिवर्तित की जा सकती है। सबसे महत्वपूर्ण बात, केवल एक ही अभिव्यक्ति (बजाय एक बयान शरीर) से मिलकर lambdas परिवर्तित किया जा सकता:

// Compile-time error 
Expression<Func<int, int>> square = x => { return x * x; }; 
// Works fine 
Func<int, int> square = x => { return x * x; }; 
3

अभिव्यक्ति रनटाइम पर बनाया जा सकता है, फ़ंक्शन नहीं (जब तक कि आप प्रतिबिंब उत्सर्जित न करें)। एक बार जब आप अभिव्यक्ति वृक्ष बनाते हैं तो आप इसे संकलित कर सकते हैं और इसे फ़ंक्शन पॉइंटर में बदल सकते हैं जिसे बुलाया जा सकता है। Func कुछ पहले से मौजूद फ़ंक्शन के लिए एक सूचक है जिसे अब संशोधित नहीं किया जा सकता है जबकि अभिव्यक्ति कुछ फ़ंक्शन के कोड का प्रतिनिधित्व करती है जो तब तक मौजूद नहीं है जब तक आप इसे संकलित नहीं करते।

0

आप आमतौर पर एक्सप्रेशन का उपयोग कर जब आप अर्थ विज्ञान कोड की सुरक्षित रखना चाहते हैं ताकि आप यह अनुवाद कर सकते हैं। यही है, अभिव्यक्ति आपको कोड के रूप में कोड का इलाज करने की अनुमति देती है। यदि कोड को डेटा के रूप में नहीं माना जाना चाहिए (यानी आप इसे संग्रहीत करने या अनुवाद करने की योजना नहीं बना रहे हैं) तो एक Func का उपयोग करना उचित है।

7

यह सच नहीं है कि "वे एक ही बात करते हैं"। Expression आपके इरादे का वर्णन इस तरीके से करता है जिसे रनटाइम पर व्याख्या किया जा सकता है - यदि आपको नुस्खा पसंद है, तो यह है। एक समारोह एक अपारदर्शी प्रतिनिधि है, का निरीक्षण नहीं किया जा सकता है - इसका उपयोग ब्लैक बॉक्स के रूप में किया जा सकता है। एक नुस्खा की तुलना में, यह किसी प्रकार का ऑटो-शेफ है जो आपको यह देखने नहीं देता है कि यह क्या करता है: इसे कुछ रोटी और कुछ चिकन दें, अपनी आंखें बंद करें और यह आपको एक सैंडविच देता है, लेकिन आपको कभी भी पता नहीं होता

मैं यहाँ इस अधिक पर चर्चा: Explaining Expression, लेकिन नुस्खा होने, यदि आप नुस्खा आप Expression.Compile() के माध्यम से अपने खुद के महाराज कर सकते हैं, है LINQ, RPC, आदि के लिए और निश्चित रूप से महत्वपूर्ण है।

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