2009-02-19 36 views
106

कोई इन 3 सबसे महत्वपूर्ण प्रतिनिधियों की एक अच्छी व्याख्या (उम्मीद उदाहरण के साथ) प्रदान कर सकते हैं एक सी # डेवलपर के बारे में पता होना चाहिए?प्रतिनिधि:</p> <ul> <li>विधेय</li> <li>कार्रवाई</li> <li>समारोह</li> </ul> <p>क्या अन्य प्रतिनिधियों: विधेय कार्रवाई समारोह

आप उत्पादन कोड में कितनी बार उपयोग करते हैं?

उत्तर

158
  • Predicate: अनिवार्य रूप से Func<T, bool>; सवाल पूछता है "क्या निर्दिष्ट तर्क प्रतिनिधि द्वारा प्रतिनिधित्व की गई शर्त को पूरा करता है?" List.FindAll जैसी चीजों में प्रयुक्त होता है।

  • Action: तर्क दिए गए एक क्रिया करें। बहुत सामान्य उद्देश्य। LINQ में बहुत अधिक उपयोग नहीं किया जाता है क्योंकि यह मूल रूप से साइड इफेक्ट्स का तात्पर्य है।

  • Func: LINQ में बड़े पैमाने पर प्रयुक्त होता है, आमतौर पर तर्क को बदलने के लिए, उदा। एक संपत्ति के लिए एक जटिल संरचना प्रक्षेपित करके।

अन्य महत्वपूर्ण प्रतिनिधियों:

  • EventHandler/EventHandler<T>: IComparer<T> की तरह लेकिन प्रतिनिधि के रूप में: सभी WinForms

  • Comparison<T> से अधिक प्रयोग किया जाता है।

+2

वहाँ भी है 'System.Converter ', हालांकि इसका शायद ही कभी उपयोग किया जाता है। –

+3

कन्वर्टर एक अच्छा प्रतिनिधि है जब बिजनेस क्लास में मॉडल का कनवर्ट करना आवश्यक है, यानी http://www.stum.de/2009/12/23/using-a-converter-to-convert-from-a -मोडेल-टू-ए-बिजनेस-क्लास/ –

+0

'EventHandler/EventHandler ' WinForms के बाहर भी दिखाई देता है। – Andy

8

जॉन के जवाब के अलावा, वहाँ भी

  • Converter<TInput, TOutput> है: यह अनिवार्य रूप Func<TInput, TOutput> है, लेकिन अर्थ विज्ञान के साथ। List.ConvertAll और Array.ConvertAll द्वारा उपयोग किया जाता है, लेकिन व्यक्तिगत रूप से इसे कहीं और नहीं देखा है।
4

MethodInvoker वह है जो WinForms डेवलपर उपयोग कर सकते हैं; यह कोई तर्क स्वीकार नहीं करता है और कोई परिणाम नहीं देता है। यह एक्शन की भविष्यवाणी करता है, और यूआई थ्रेड पर आविष्कार करते समय भी अक्सर इसका उपयोग किया जाता है क्योंकि BeginInvoke() et al untyped Delegate को स्वीकार करता है; हालांकि एक्शन भी वही करेगा।

myForm.BeginInvoke((MethodInvoker)delegate 
{ 
    MessageBox.Show("Hello, world..."); 
}); 

मुझे थ्रेडस्टार्ट और पैरामीटरेटेड थ्रेडस्टार्ट के बारे में भी पता होगा; फिर से ज्यादातर लोग इन दिनों एक एक्शन बदल देंगे।

3

भविष्यवाणी, Func और Action .NET के अंतर्निहित प्रतिनिधि उदाहरण हैं। इनमें से प्रत्येक प्रतिनिधि उदाहरण विशिष्ट हस्ताक्षर के साथ उपयोगकर्ता विधियों को संदर्भित या इंगित कर सकता है।

कार्य प्रतिनिधि - कार्य प्रतिनिधि उदाहरण उन विधियों को इंगित कर सकते हैं जो तर्क लेते हैं और शून्य लौटाते हैं।

Func प्रतिनिधि - Func प्रतिनिधि उदाहरण विधि (ओं) को इंगित कर सकता है जो तर्कों की चर संख्या लेते हैं और कुछ प्रकार लौटाते हैं।

पूर्वानुमान - भविष्यवाणियां func प्रतिनिधि उदाहरणों के समान हैं और वे उन विधियों को इंगित कर सकते हैं जो तर्कों की परिवर्तनीय संख्या लेते हैं और एक बूल प्रकार लौटाते हैं।

23

Action, Func और Predicate सभी प्रतिनिधि परिवार के हैं।

Action: कार्य एन इनपुट पैरामीटर ले सकता है लेकिन यह शून्य हो जाता है।

Func: Func एन इनपुट पैरामीटर ले सकता है लेकिन यह हमेशा प्रदान किए गए प्रकार के परिणाम को वापस कर देगा। Func<T1,T2,T3,TResult>, यहां टी 1, टी 2, टी 3 इनपुट पैरामीटर हैं और ट्रेशल्ट इसका आउटपुट है।

Predicate: पूर्वानुमान भी Func का एक रूप है लेकिन यह हमेशा बूल लौटाएगा। सरल शब्दों में यह Func<T,bool> का आवरण है।

2

अन्य ने पहले ही विशिष्ट प्रतिनिधियों के सही उपयोगों का उल्लेख किया है, लेकिन मैं कुछ ऐसा जोड़ना चाहता हूं जो उनके उत्तरों को पूरा करेगा। नाम Func, एक्शन, भविष्यवाणी गणितीय पृष्ठभूमि है। चीजों को सरल रखने के लिए मैं इस तरह के गणितीय कार्य की अनौपचारिक परिभाषा दूंगा:

एक फ़ंक्शन सेट के बीच एक रिश्ता है। हम एक सेट के सदस्य लेते हैं और इसे इनपुट के रूप में उपयोग करते हैं और फ़ंक्शन इस इनपुट को दूसरे सेट के केवल एक सदस्य को मानचित्र करता है। दूसरे शब्दों में, कुछ इनपुट प्राप्त करता है और आउटपुट उत्पन्न करता है।

फिर, अनौपचारिक रूप से, गणितीय भविष्यवाणी एक ऐसा बयान है जो इसके चर के आधार पर सत्य या गलत हो सकता है। जैसा कि अन्य ने एक समारोह का उल्लेख किया है जो बूलियन लौटाता है।

और आखिरी, कार्रवाई एक शून्य समारोह है (या अधिक गणितीय सही नाम -void विधि या प्रक्रिया)

1

कार्रवाई और समारोह लैम्ब्डा के साथ:

person p = new person(); 
Action<int, int> mydel = p.add;  /*(int a, int b) => { Console.WriteLine(a + b); };*/ 
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/ 
mydel(2, 3); 
string s1= mydel1(" Akhil"); 
Console.WriteLine(s1); 
Console.ReadLine(); 
संबंधित मुद्दे