डेलीगेट्स: प्रीडेटेट बनाम एक्शन बनाम फंक


137

क्या कोई इन 3 सबसे महत्वपूर्ण प्रतिनिधियों को एक अच्छी व्याख्या (उदाहरण के साथ उम्मीद) प्रदान कर सकता है:

  • विधेय
  • कार्य
  • समारोह

जवाबों:


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

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

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

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

  • EventHandler/ EventHandler<T>: सभी WinForms पर इस्तेमाल किया

  • Comparison<T>: जैसे IComparer<T>लेकिन प्रतिनिधि रूप में।


3
वहाँ भी है System.Converter<TInput, TOutput>, हालांकि यह शायद ही कभी इस्तेमाल किया जाता है।
G-Wiz

4
कनवर्टर एक अच्छा प्रतिनिधि जब बिजनेस क्लास में मॉडल की परिवर्तित का एक बहुत जरूरत है, यानी stum.de/2009/12/23/...
माइकल Stum

EventHandler/EventHandler<T>WinForms के बाहर भी सभी दिखाई देते हैं।
एंडी

@ और: थोड़ा ... उदाहरण के लिए WPF में इतना कम। मैं मानता हूं कि इसके लिए कुछ भी WinForms- विशिष्ट नहीं है।
जॉन स्कीट

48

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

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

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

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


BEST और SIMPLEST उत्तर मैंने इस प्रश्न के संबंध में कभी पाया है
रेयान चौगल

@ReyanChougle: खुशी है, आपको यह मददगार लगी।
राहुल गर्ग

9

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

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

4

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

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

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


3

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

एक्शन प्रतिनिधि - एक्शन डेलीगेट इंस्टेंसेस उन तरीकों की ओर इशारा कर सकता है जो तर्क और रिटर्न को शून्य लेते हैं।

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

Predicate - Predicates, प्रतिनिधि डेलिगेट उदाहरणों के समान हैं और वे उन विधियों को इंगित कर सकते हैं जो चर संख्या के तर्क लेते हैं और एक बूल प्रकार वापस करते हैं।


2

लैंबडा के साथ एक्शन और फंक:

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();

2

फंक अधिक LINQ अनुकूल है, इसे एक पैरामीटर के रूप में पारित किया जा सकता है। (बिंदु से मुक्त)

समर्पित नहीं किया जा सकता है, फिर से लपेटा जाना चाहिए।

Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;

new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again

new []{2,-4}.Where(IsPositivePred);  //Compile Error
new []{2,-4}.Where(IsPositiveFunc);  //Func as Parameter

2

तर्कों के बारे में एक सरल उदाहरण और प्रत्येक प्रकार से क्या पता चलता है

यह फंक दो इंटर्नल आर्ग्युमेंट्स लेता है और एक इंटर्न लौटाता है। फ़नक में हमेशा रिटर्न टाइप होता है

 Func<int, int, int> sum = (a, b) => a + b;
 Console.WriteLine(sum(3, 5));//Print 8

इस मामले में func में तर्क नहीं हैं, लेकिन एक स्ट्रिंग लौटाते हैं

Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world

यह क्रिया दो अंतर तर्क और शून्य लौटाती है

Action<int, int> displayInput = (x, y) => Console.WriteLine("First number is :" + x + " , Second number is "+ y);
displayInput(4, 6); //Print First number is :4 , Second number is :6

यह Predicate एक तर्क लेता है और हमेशा बूल वापस करता है। आमतौर पर Predicates हमेशा बूल वापस करता है।

Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.