2016-06-30 13 views
10

की जाँच मैं आमतौर पर इतनी तरह की जाँच के गार्ड करते हैं:गार्ड lambdas

if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException(); 

ExpressionType enum है:

public void doStuff(Foo bar, Expression<Func<int, string>> pred) { 
    if (bar == null) throw new ArgumentNullException(); 
    if (pred == null) throw new ArgumentNullException(); 
    // etc... 
} 

मैं इस अतिरिक्त जांच करते हैं कि सुनिश्चित करता है कि विधेय वास्तव में एक लैम्ब्डा है देखा है कई संभावनाएं, लेकिन मुझे समझ में नहीं आता कि उनमें से कोई भी कैसे लागू होगा क्योंकि मुझे लगता है कि संकलक केवल लैम्ब्डा की अनुमति देगा।

प्रश्न 1: क्या इसका कोई फायदा है? हम सभी इनपुट की पूरी तरह से जांच कर रहे हैं, तो क्या यह मूल्य जोड़ता है?

प्रश्न 2: क्या कोई प्रदर्शन जुर्माना है - यानी क्या यह नियमित प्रकार/सीमा/शून्य जांच से अधिक समय लेता है?

+0

ऐसा लगता है कि क्यू 1 आपको लाभ देता है यदि आप चाहते हैं कि यह सुनिश्चित करने के लिए कि आपकी अभिव्यक्ति एक निश्चित प्रकार की है, बस इसे जांचने के बजाय। – Glubus

+0

@Glubus हालांकि यह लैम्बडा के अलावा कुछ भी शुरू हो सकता है? –

+0

हां। अभिव्यक्तियों का उपयोग डेटा के मेटा-डेटा का वर्णन और उपयोग करने के लिए किया जाता है। 'अभिव्यक्ति << Func >' एक प्रतिनिधि का वर्णन करता है जो एक पूर्णांक स्वीकार करता है और एक स्ट्रिंग देता है, लेकिन वास्तव में इस प्रतिनिधि के उदाहरण को परिभाषित नहीं करता है। इस तरह आप उन्हें एक साथ जोड़कर पूरे अभिव्यक्ति पेड़ बना सकते हैं। अभिव्यक्ति वर्ग के बारे में mdsn आलेख को चेकआउट करें। – Glubus

उत्तर

3

Func<int, string> एक प्रतिनिधि है जो एक समारोह या इनलाइन का पता लैम्ब्डा अभिव्यक्ति के रूप में हो सकता है [() => x]।

LambdaExpression से

Expression<TDelegate> संभालते हैं और एक Expression<TDelegate> की NodeType हमेशा ExpressionType.Lambda.

तो, मुझे लगता है कि बचाव की मुद्रा में कोड उस तरह की जरूरत नहीं है है।

+0

हाँ यह मेरी सोच थी। मैं नहीं देखता कि यह इस मामले में और कुछ कैसे हो सकता है। –

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