2010-12-20 14 views
7

मैंने कुछ नए सी # वाक्यविन्यास की खोज की और इसका अर्थ यह नहीं है कि इसका क्या अर्थ है।मैं कॉलबैक प्रतिनिधि के स्थान पर लैम्ब्डा अभिव्यक्ति का उपयोग क्यों कर सकता हूं?

1)

BeginInvoke(new Action(() => 
    { 
     PopulateUI(ds); 
    })); 

2)

private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(() => GetSqlData()); 
} 

new Action() का अर्थ क्या है और => प्रतीक का अर्थ क्या है: यहाँ वाक्य रचना से संबंधित कोड है?

ThreadPool.QueueUserWorkItem का सिंटैक्स ThreadPool.QueueUserWorkItem(new WaitCallback(PrintOut), "Hello"); था लेकिन यहां यह ThreadPool.QueueUserWorkItem(() => GetSqlData()); दिखाता है, तो यह कैसे काम करता है? WaitCallback क्यों गुम है? विस्तार से समझाओ।

बहुत बहुत धन्यवाद।

+8

*() => some_code * एक लैम्ब्डा अभिव्यक्ति है और अज्ञात प्रतिनिधियों को लिखने के लिए सिर्फ एक शॉर्टकट है। मुझे लगता है कि आपका भ्रम एक ही चीज़ को प्राप्त करने के कई तरीकों से होता है। –

+0

@ पॉली Østerø: बहुत अच्छी तरह से कहा :) – BoltClock

+0

'ThreadPool.QueueUserWorkItem (() => GetSqlData()); 'मेरे परीक्षण ऐप में संकलित नहीं है। .NET ढांचे का कौन सा संस्करण आपकी परियोजना का उपयोग कर रहा है (या कम से कम, वीएस का कौन सा संस्करण)? –

उत्तर

6

Action Delegate

पर एक नज़र डालें एक विधि एक एकल पैरामीटर है और एक मूल्य वापस नहीं करता है कि समाहित। पैरामीटर के रूप में एक विधि को स्पष्ट रूप से घोषित किए बिना किसी विधि को पास करने के लिए आप कार्रवाई प्रतिनिधि का उपयोग कर सकते हैं।

और

और Lambda Expressions (C# Programming Guide)

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

सभी लैम्ब्डा अभिव्यक्ति लैम्ब्डा ऑपरेटर => का उपयोग करते हैं, जिसे " पर" के रूप में पढ़ा जाता है। लैम्ब्डा ऑपरेटर का बायां तरफ इनपुट पैरामीटर (यदि कोई है) निर्दिष्ट करता है और दाईं ओर अभिव्यक्ति या कथन ब्लॉक रखता है। लैम्ब्डा अभिव्यक्ति x => x * x पढ़ा जाता है "x x x x x पर जाता है।"

4

इन्हें lambda expressions के नाम से जाना जाता है, जो सी # में प्रतिनिधियों से बहुत अलग नहीं हैं।

खाली () का मतलब है कि कोई तर्क नहीं है, और (वैकल्पिक) {} के बीच क्या है लैम्ब्डा अभिव्यक्ति निकाय हैं। => ऑपरेटर लैम्बडा अभिव्यक्ति बनाने के लिए दोनों अभिव्यक्तियों को एक साथ जोड़ता है। एक तरफ के रूप में, वे आमतौर पर LINQ कोड में पाए जाते हैं।

new Action() के बारे में विशेष कुछ भी नहीं है, सिर्फ इतना है कि यह एक delegate है जो अपने आप को एक लैम्ब्डा अभिव्यक्ति मैप कर सकते हैं है।

ThreadPool.QueueUserWorkItem() के लिए, WaitCallback तर्क एक प्रतिनिधि है।आप या तो नामित प्रतिनिधि का नाम तर्क के रूप में पास कर सकते हैं, गुमनाम delegate ऑब्जेक्ट पास कर सकते हैं या इस अज्ञात delegate (आपके मामले में यह () => GetSqlData()) के लिए लैम्ब्डा अभिव्यक्ति लिख सकता है।

+0

@Gabe: ओह, मैंने इसे अभी संपादित कर लिया है। – BoltClock

5

के रूप में अन्य लोगों ने कहा, यह एक लैम्ब्डा, जो मूल रूप से एक गुमनाम (बेनाम) स्थानीय समारोह है।

अगर आप कुछ इसी तरह कोड है कि lambdas उपयोग नहीं करता है पर देखने में थोड़ा और अधिक समझ बनाने सकता है:

// With a lambda 
private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(() => GetSqlData()); 
} 

// Without a lambda 
private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(ExecuteGetSqlData); 
} 

private void ExecuteGetSqlData() 
{ 
    // If GetSqlData returns something, change this to "return GetSqlData();" 
    GetSqlData(); 
} 

अन्य कोड के रूप में, सामान्य रूप से आप new Action करने के लिए नहीं होना चाहिए। समस्या यह है कि BeginInvoke विधि Delegate लेती है, जो पुराने स्कूल की तरह है, और यह टूटती है कि सबसे नया कोड कैसे काम करता है।

नए कोड के साथ (जो Action, या WaitCallback जैसे किसी विशिष्ट प्रकार के प्रतिनिधि को लेता है), आप या तो लैम्ब्डा लिखते हैं, या बस अपनी कक्षा के अंदर एक फ़ंक्शन का नाम दें। मैंने ऊपर लिखा उदाहरण कोड इन दोनों को दर्शाता है।

यह भी ध्यान दें कि यदि आपको कुछ ऐसा लगता है: (Action) (() => Blah()), यह new Action(() => Blah()) जैसा ही है।

+0

आपकी मदद के लिए धन्यवाद;)। – Thomas

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