c# - Func बनाम एक्शन बनाम भविष्यवाणी
delegates (2)
Func
और Action
बीच का अंतर यह है कि क्या आप प्रतिनिधि को एक मूल्य ( Func
उपयोग करें) या नहीं ( Action
उपयोग करें) वापस करना चाहते हैं।
Func
शायद सबसे अधिक LINQ में उपयोग किया जाता है - उदाहरण के लिए अनुमानों में:
list.Select(x => x.SomeProperty)
या फ़िल्टरिंग:
list.Where(x => x.SomeValue == someOtherValue)
या मुख्य चयन:
list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)
List<T>.ForEach
: जैसी चीजों के लिए आमतौर पर Action
का उपयोग किया जाता है: सूची में प्रत्येक आइटम के लिए दिए गए क्रिया को निष्पादित करें। मैं Func
से कम अक्सर इसका उपयोग करता हूं, हालांकि मैं कभी-कभी Control.BeginInvoke
और Dispatcher.BeginInvoke
जैसी चीज़ों के लिए पैरामीटर रहित संस्करण का उपयोग करता हूं।
Predicate
सिर्फ एक विशेष cased Func<T, bool>
वास्तव में, सभी Func
से पहले पेश की गई है और अधिकांश Action
प्रतिनिधियों के साथ आया था। मुझे संदेह है कि अगर हमारे पास पहले से ही उनके विभिन्न गानों में Func
और Action
था, तो Predicate
नहीं की गई थी ... हालांकि यह प्रतिनिधि के उपयोग के लिए एक निश्चित अर्थ प्रदान करता है , जबकि Func
और Action
का व्यापक रूप से असमानता के लिए उपयोग किया जाता है प्रयोजनों।
FindAll
और RemoveAll
जैसी विधियों के लिए FindAll
List<T>
में उपयोग की RemoveAll
।
इस प्रश्न का उत्तर यहां दिया गया है:
वास्तविक उदाहरणों और उनके उपयोग के साथ, क्या कोई मुझे समझने में मदद कर सकता है:
- हमें Func प्रतिनिधि की आवश्यकता कब होगी?
- हमें कार्य प्रतिनिधि की आवश्यकता कब होगी?
- हमें प्रतिनिधियों को भविष्यवाणी करने की आवश्यकता कब होती है?
Func - जब आप ऐसे फ़ंक्शन के लिए प्रतिनिधि चाहते हैं जो पैरामीटर ले सकता है या नहीं कर सकता है और कोई मान देता है। LINQ से सबसे आम उदाहरण का चयन किया जाएगा:
var result = someCollection.Select( x => new { x.Name, x.Address });
क्रिया - जब आप ऐसे फ़ंक्शन के लिए प्रतिनिधि चाहते हैं जो पैरामीटर ले सकता है या नहीं कर सकता है और कोई मान वापस नहीं करता है। मैं इन्हें अक्सर अज्ञात ईवेंट हैंडलर के लिए उपयोग करता हूं:
button1.Click += (sender, e) => { /* Do Some Work */ }
भविष्यवाणी - जब आप एक Func का एक विशेष संस्करण चाहते हैं जो मानदंडों के एक सेट के खिलाफ मूल्य का मूल्यांकन करता है और एक बूलियन परिणाम देता है (एक मैच के लिए सच है, अन्यथा गलत है)। दोबारा, इन्हें LINQ में अक्सर चीजों के लिए उपयोग किया जाता है जैसे कहां:
var filteredResults =
someCollection.Where(x => x.someCriteriaHolder == someCriteria);
मैंने बस दो बार चेक किया है और यह पता चला है कि LINQ भविष्यवाणियों का उपयोग नहीं करता है। निश्चित नहीं है कि उन्होंने यह निर्णय क्यों लिया ... लेकिन सैद्धांतिक रूप से यह अभी भी एक ऐसी स्थिति है जहां एक भविष्य फिट होगा।